Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Создание динамической кнопки

Задание, нужно чтобы при нажатии пункта меню создавалась кнопка, но приложение выдаёт ошибку при нажатии
Подскажите, может что не так написала
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class MainActivity extends AppCompatActivity {
 
    Button btn;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }
 
    public void onMn1Click(MenuItem item){
        LinearLayout layout = (LinearLayout) findViewById(R.id.myLayout);
 
        ConstraintLayout.LayoutParams param = new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT);
      //  Toast.makeText(this,"Hello world", Toast.LENGTH_LONG).show();
        btn = new Button(this);
        btn.setText("Button");
        param.setMargins(150, 150, 0, 0);
        btn.setLayoutParams(param);
        btn.setX(100);
        btn.setY(500);
        layout.addView(btn);
 
        /**/
    }
}
В коде пишет что переполнена findViewById(точнее подчёркивает перед ним то что в скобках), но я ещё плохо разбираюсь, подскажите как исправить))
Заранее спасибо^^
Ответ: На этом убогом скрине нет ошибок.
Причина падения приложения находится во вкладке logcat.

Добавлено через 2 минуты
Серая запись означает, что это избыточное написание. Так достаточно:
LinearLayout layout = findViewById(R.id.myLayout);
В принципе, если навести курсор, студия сама всё скажет и даже предложит исправление.
Вопрос: Назначить идентификаторы кнопкам в адаптере списка

Есть цикл генерации данных для адаптера списка
Java
1
2
3
4
5
6
7
8
9
10
11
void fillData() {
        for (int i = 1; i <= 17; i++) {
            String[] cySerNmArr = getResources().getStringArray(R.array.cySerNm);
            String[] cySerSubNmArr = getResources().getStringArray(R.array.cySerSubNm);
 
            TypedArray cySerPicsArr = getResources().obtainTypedArray(R.array.cyPics);
 
            products.add(new Product(cySerNmArr[i], cySerSubNmArr[i],
                    cySerPicsArr.getDrawable(i), null, null));
        }
 }
Дальше я вставляю в View с помощью данного класса.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // используем созданные, но не используемые view
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.cy_item, parent, false);
        }
 
        Product p = getProduct(position);
 
        // заполняем View в пункте списка данными из товаров: название, описание
        // и картинка
        ((TextView) view.findViewById(R.id.tvDescr)).setText(p.cyNm);
        ((TextView) view.findViewById(R.id.tvSubDescr)).setText(p.cySubNm);
        ((ImageView)view.findViewById(R.id.ivImage)).setImageDrawable(p.cyImg);
        ((Button)   view.findViewById(R.id.chooseButton)).setId(position);
 
        return view;
    }
 
    Button.OnClickListener btnclick = new Button.OnClickListener(){
 
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case 0:
                    //dosomething1();
                    break;
                case 1:
                    //dosomething2();
                    break;
                default:
                    break;
            }
        }
 
    };
 
    Product getProduct(int position) {
        return ((Product) getItem(position));
    }
В этой строке
Java
1
        ((Button)   view.findViewById(R.id.chooseButton)).setId(position);
я пытаюсь раздать ID кнопкам, но студия выдаёт что-то вроде "Button - redundant", но вроде как всё должно быть нормально.
И ещё там же ниже можно видеть заготовку под клик, тоже не разобрался как OnClickListener привязать к динамической кнопке.
Спасибо за любую помощь
Ответ: не знаю получил ли в личку. напишу тут тоже


на счет фил дата, ты с фрагмента, или активити , передаешь в констрактор адаптера готовый лист который обрабатывает адаптер, лист у тебя обьект класса, то есть с любой функции ты можешь к нему добраться. когда будет нажата кнопка адаптер вернет индекс(позицию) то есть так как я тебе написал в примере ты уже будешь знать что выбрали остается достать конкретный обьект продукта и передать его фрагменту.
дальше. как открыть новый фрагмент, лучше почитай поподробней в гугле, вот пример:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class AdvancedSettingsFragment extends Fragment {
        private static final String SELECTED_LANGUAGE = "selected_language";
 
      public static AdvancedSettingsFragment newInstance(String selectedLanguage) {
        AdvancedSettingsFragment advancedSettingsFragment = new AdvancedSettingsFragment();
        Bundle bundle = new Bundle();
        bundle.putString(SELECTED_LANGUAGE, selectedLanguage);
        advancedSettingsFragment.setArguments(bundle);
        return advancedSettingsFragment;
    }
    
    
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    }
 
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         if (getArguments() != null) {
            mSelectedLanguage = getArguments().getString(SELECTED_LANGUAGE);
        }
    }
 
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return super.onCreateView(inflater, container, savedInstanceState);
    }
 
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }
 
    @Override
    public void onResume() {
        super.onResume();
    }
 
    @Override
    public void onPause() {
        super.onPause();
    }
}
обрати внимание на функцию нью инстанс и на функцию онкриейт.

вот так переходят на фрагмент с активити или другого фрагмента:
Java
1
2
3
FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.add(AdvancedSettingsFragment.newInstance("English"), null);
    ft.commit();
как я и сказал в обрати внимание на ньюинстанс в фрагменте, через эту функцию он может принять параметры из активити, а в онкриейт он их достанет куда тебе нужно.

в твоем случае , я бы разобрал обьект продукт который мы получаем из листа (selectedProduct), на его поля(стринги,инты ), передал бы через ньюинстанс фрагменту (на самом деле через бандел но не будем углубляться), в фрагменте создал бы обьект класса продукт и в онкрейт добавил бы в него полученные поля. в нью инстанс можно добавить сколько угодно полей.

еще обрати внимание что у фрагмента есть свой хмл, просто я не показал его, нет связи
Вопрос: Один обработчик для динамических кнопок

Кнопки создаются/удаляются, и у них один OnClickListener. Но при нажатии, надо получить текст именно с той кнопки на которую нажали. Как это реализовать?

Добавлено через 22 минуты
Проблемма решена:
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
View.OnClickListener test = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
       ((Button) view).setText("TEST---OK");      
    }
};
Ответ: Вы подтвердили общеизвестное правило: "проблема решается через 15 минут после того, как запостить вопрос на форуме". :-)
Вопрос: динамическая кнопка с каринкой

Всем привет, нужна помощь
Сделал свою кнопку, с картинками, вставляю программно, но никак нимогу задать размер
Помогите решить проблему, setLayoutParams не помогает
Ответ: GridLayout.spec() принимает только тип int, по этому задал размеры по высоте и ширине
Вопрос: Как запустить функционал кнопки FAB из RecyclerListAdapter

Добрый день.

Ситуация такая: На кнопке FAB есть определенный функционал (создание элемента)
Хочу добавить редактирование элемента и использовать тот же DialogFragment что и при создании (на кнопке FAB) только передавать в параметрах ID элемента.
Вопрос первый правильно ли так делать? Или нужно создавать другой диалог,
и если правильно, то отсюда вытекает второй вопрос, как это сделать из адаптера, так как я в нем повесил обработку меню. Что то мне кажется адаптер не должен работать с фрагментами (ну и с базой соответственно как я реализовал в примере ниже)

Спасибо.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
   @Override
    public void onBindViewHolder(final RemindViewHolder holder, final int position) {
 
        final ArrearsDTO itemList = data.get(position);
        holder.persone.setText(data.get(position).getPersone());
        holder.deadlineDate.setText(data.get(position).getDeadlineMan());
        holder.summ.setText(Integer.toString(data.get(position).getSumm()) + " руб.");
 
        holder.txtOptionDigit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               
                PopupMenu popupMenu = new PopupMenu(mContext, holder.txtOptionDigit);
                popupMenu.inflate(R.menu.option_card_menu);
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        long rowId = itemList.getId();
                        switch (item.getItemId()) {
                            case R.id.actionEditItem:
                                Toast.makeText(mContext, "Edit", Toast.LENGTH_LONG).show();
                                break;
                            case R.id.actionDeleteItem:
                                 DBHelper dbHelper = new DBHelper(mContext);
                                dbHelper.deleteDebt(rowId);
                                data.remove(position);
                                notifyDataSetChanged();
                                Toast.makeText(mContext, "Удалено", Toast.LENGTH_LONG).show();
                                break;
                            default:
                                break;
                        }
                        return false;
                    }
                });
                popupMenu.show();
            }
        });
 
    }
Ответ:
Вопрос: Динамический вывод распознавания речи

Как можно сделать динамический вывод голоса в текст? То есть во время разговора оно заполняет TextView, а не после окончания. Использую через интент голосовой поиск гугла. И как сделать чтобы не вылезало это окошко с распознаванием речи?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  public void speak(View view) {
            Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ru-RU");
            intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Говорите после сигнала!");
            startActivityForResult(intent, current);
        }
    }
 
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        try {
            ArrayList<String> textMatchList = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            if (resultCode == RESULT_OK) {
                TextView.setText(textMatchList.get(0));
                }
            }
        } catch (Exception ex) {
        }
 
        super.onActivityResult(requestCode, resultCode, data);
    }
Ответ:
Сообщение от hnvor
Как можно сделать динамический вывод голоса в текст? То есть во время разговора оно заполняет TextView, а не после окончания.
Самому стало интересно как пользоваться распознанием речи. Почитал документацию. Оказалось всё довольно просто. У существует всего два фабричных метода для создания кастомного экземпляра и 5 методов по работе с ним: startListening(Intent recognizerIntent), stopListening(), setRecognitionListener(RecognitionListener listener), cancel() и destroy(). Ваша работа сводится к созданию слушателя.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@OnClick(R.id.startListening)
    public void onViewClicked() {
        SpeechRecognizer speech = SpeechRecognizer.createSpeechRecognizer(this);
        speech.setRecognitionListener(new RecognitionListener() {
            // ...
            @Override
            public void onResults(Bundle results) {
                List<String> finalResult = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION );
                String spokenText = res.get(0);
                translatedTextView.setText(spokenText);
            }
 
            @Override
            public void onPartialResults(Bundle partialResults) {
                List<String> partialResult = partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
                String spokenText = res.get(0);
                translatedTextView.setText(spokenText);
            }
        });
 
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        // по дефолту этот параметр фолс
        intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
        ...
        speech.startListening(intent);
    }
Вопрос: Как подогнать ряд кнопок в TableLayout под ширину экрана?

День добрый. Пишу игру простенькую Крестики-нолики.
Поле состоит квадрата 3x3 из Кнопок, которые генерируются в коде.

Размер кнопки устанавливается при создании.
Java(TM) 2 Platform Standard Edition 5.0
1
2
button.setWidth(100);
button.setHeight(100);
Но на разных телефонах кнопки естественно по разному (где-то маленькие кнопки, а где-то не влазят целиком в экран), т.к. метод setWidth задает все в пикселях.

Вопрос, как можно сделать, чтобы ряд кнопок влезал на всех экранах?


Вот код создания кнопок:

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
    //динамически добавляет строки и колонки в игровое поле
    private void buildGameField() {
        Square[][] field = game.getField();
        for (int i = 0, lenI = field.length; i < lenI; i++) {
            final int x=i;
            TableRow row = new TableRow(this);      //создание строки таблицы
            for (int j = 0, lenJ = field[i].length; j < lenJ; j++) {
                final int y = j;
                Button button = new Button(this);
                buttons[i][j] = button;
 
                // установка слушателя, реагирующего на клик по кнопке
                button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Button button = (Button) v;
                        Game g = game;
                        Player player = g.getCurrentActivePLayer();
                        if (makeTurn(x, y)) {
                            button.setText(player.getName());
                        }
                        Player winner = g.checkWinner();
                        if (winner != null) {
                            gameOver(winner);
                        }
                        //если поле заполнено
                        if (g.isFieldFilled()) {
                            gameOver();
                        }
                    }
                });
 
                //добавление кнопки в таблицу
                row.addView(button, new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT));
 
                button.setWidth(100);
                button.setHeight(100);
            }
            //добавление строки в таблицу
            layout.addView(row, new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT));
        }
    }
Ответ:
Сообщение от egorikftp
Вопрос, как можно сделать, чтобы ряд кнопок влезал на всех экранах?
делать все в xml

Добавлено через 1 час 21 минуту
вот набросал, может пригодится
1. открываем файл style.xml и дописываем такие строки
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
    <style name="MyAwesomeStyle">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">match_parent</item>
        <item name="android:layout_weight">1</item>
    </style>

со стилем кода будет куда меньше и менять потом что-то удобнее

2. создаем файл разметки, например field.xml с таким содержимым
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <LinearLayout
        android:id="@+id/field"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:orientation="vertical">
 
        <LinearLayout
            style="@style/MyAwesomeStyle"
            android:orientation="horizontal">
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="1" />
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="2" />
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="3" />
        </LinearLayout>
 
        <LinearLayout
            style="@style/MyAwesomeStyle"
            android:orientation="horizontal">
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="4" />
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="5" />
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="6" />
        </LinearLayout>
 
        <LinearLayout
            style="@style/MyAwesomeStyle"
            android:orientation="horizontal">
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="7" />
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="8" />
 
            <Button
                style="@style/MyAwesomeStyle"
                android:text="9" />
        </LinearLayout>
    </LinearLayout>
 
</FrameLayout>

Это просто пример разметки, 9 кнопок которые будут квадратиком в центре экрана. При повороте размер будет пересчитываться.

3. в onCreate() добавляем немного кода
Кликните здесь для просмотра всего текста
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
        findViewById(R.id.field).addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                View parentView = (View) v.getParent();
                int size = Math.min(parentView.getMeasuredWidth(), parentView.getMeasuredHeight());
                ViewGroup.LayoutParams params = v.getLayoutParams();
                params.width = size;
                params.height = size;
                v.setLayoutParams(params);
            }
        });

в принципе и все
Вопрос: Внешние ключи SQLite + динамическое созание таблиц

Добрый день.
Никак не могу нагуглить инфу о создании и привязке ключа к другой таблице.
Есть одна таблица "Organization (org_id, name)".
К каждому полю должна привязываться динамически созданная таблица с адресами каждой организации.

Как динамически создатвать и привязывать к полю "org_id" динамически созданные таблицы?

Допустим org_id = 4, нужно создать таблицу с именем и полями Adress4 (adress_id, name) и заполнять ее.
И, соответственно, искать все поля в таблице Adress4 если выбрано поле org_id = 4 из таблицы Organization

Есть класс DataBaseHelper extends SQLiteOpenHelper
в onCreate(SQLiteDatabase db) не могу (понять) создавать разные имена таблиц через db.execSQL.
Ответ:
Сообщение от Dark-VIN
Сообщение от Frozik6k
Log.d(LOG_TAG, "onCreate DBHelper");
db.execSQL(DB_CREATE_SCRIPT);
Log.d(LOG_TAG, "Создание таблицы атрибутов");
db.execSQL(DB_CREATE_TABLE_ATTR_SCRIPT);
Log.d(LOG_TAG, "Создание таблицы фото");
db.execSQL(DB_CREATE_TABLE_FOTOS_SCRIPT);
Log.d(LOG_TAG, "Создание таблицы списка атрибутов");
db.execSQL(DB_CREATE_TABLE_LIST_ATTR_SCRIPT);
Это в onCreate(SQLiteDatabase db) ?
В нем родимом
Вопрос: TabHost, Activity, кнопка обновить на MainActivity

Здравствуйте!
Надеюсь вы мне поможете!
Структура программы:
MainActivity, сверху заголовок программы, два Item-а основного меню (обновить, настройки), TabHost.
При запуске в Tabhost создаются 2 вкладки и привязываются 2 класса как содержимое вкладок.
На первой кладке Listview (до второй еще не дошел), при создании вкладки Listview заполняется.
Заполняется через AsyncTask (запрос на сайт, парсинг JSON)...

Сейчас у меня стоит задача отработать кнопку обновления данных.

Т.е. у меня не получается обратиться к ListView-у из MainActivity (на нем расположена кнопка "Обновить" в main_menu), который расположен в другом activity на вкладке TabHost.

Возможно я изначально не правильно сделал архитектуру приложения. Конечно я могу сделать кнопку "обновить" для каждой вкладки по отдельности, но мне кажется это будет не красиво.

Подскажите правильный путь...

Вот MainActivity:

Код

package com.example.user.myapplication;

import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONArray;

import android.app.LocalActivityManager;
import android.app.TabActivity;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.SimpleAdapter;
import android.widget.TabHost;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;

import java.io.InputStream;
import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;


public class MainActivity extends AppCompatActivity {

    public static String LOG_TAG = "my_log";
    private ArrayList<HashMap<String, Object>> mCatList;
    private static final String TITLE = "catname"; // Верхний текст
    private static final String DESCRIPTION = "description"; // ниже главного
    private static final String ICON = "icon";  // будущая картинка

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);





        TabHost tabHost = (TabHost) findViewById(R.id.tabHost);
        Log.d(LOG_TAG, "Setup");

        LocalActivityManager mLocalActivityManager = new LocalActivityManager(this, false);
        //setup(mLocalActivityManager);
        mLocalActivityManager.dispatchCreate(savedInstanceState);
        tabHost.setup(mLocalActivityManager);
        TabHost.TabSpec spec;
        Log.d(LOG_TAG, "TabSpec spec");
        spec = tabHost.newTabSpec("tag1");
        Log.d(LOG_TAG, "setContent");

        spec.setContent(new Intent(this,atmActivity.class));


        Log.d(LOG_TAG, "setIndicator");
        spec.setIndicator("TAB 1");
        Log.d(LOG_TAG, "addTab");
        tabHost.addTab(spec);

        Log.d(LOG_TAG, "TabSpec spec");
        spec = tabHost.newTabSpec("tag2");
        Log.d(LOG_TAG, "setContent");

        //spec.setContent(R.id.tab2);

        spec.setContent(new Intent(this,iptActivity.class));
        Log.d(LOG_TAG, "setIndicator");
        spec.setIndicator("TAB 2");
        Log.d(LOG_TAG, "addTab");
        tabHost.addTab(spec);

        tabHost.setCurrentTab(0);


       // new ParseTask().execute();
    }
        private class ParseTask extends AsyncTask<Void, Void, String> {

            HttpURLConnection urlConnection = null;
            BufferedReader reader = null;
            String resultJson = "";

            @Override
            protected String doInBackground(Void... params) {
                // получаем данные с внешнего ресурса
                try {
                    Log.d(LOG_TAG,"получаем данные с внешнего ресурса");
                    URL url = new URL("_Здесь URL, получаю JSON данные_");

                    urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.setRequestMethod("GET");
                    urlConnection.connect();

                    InputStream inputStream = urlConnection.getInputStream();
                    StringBuffer buffer = new StringBuffer();

                    reader = new BufferedReader(new InputStreamReader(inputStream));

                    String line;
                    while ((line = reader.readLine()) != null) {
                        buffer.append(line);
                    }
                    Log.d(LOG_TAG,"Получили данные");
                    resultJson = buffer.toString();

                } catch (Exception e) {
                    e.printStackTrace();
                }
                return resultJson;
            }

            @Override
            protected void onPostExecute(String strJson) {
                super.onPostExecute(strJson);
                // выводим целиком полученную json-строку
                Log.d(LOG_TAG, strJson);

                JSONObject dataJsonObj = null;


                try {
                    dataJsonObj = new JSONObject(strJson);
                    JSONArray atms = dataJsonObj.getJSONArray("atm");

                    ListView iptlist = (ListView) findViewById(R.id.iptlist);

                    mCatList = new ArrayList<HashMap<String, Object>>();
                    HashMap<String, Object> hm;



                  
                    for (int i = 0; i < atms.length(); i++) {
                        JSONObject atm = atms.getJSONObject(i);

                        hm = new HashMap<>();
                        hm.put(TITLE, atm.getString("ATMID")+" "+atm.getString("Name")); // Название
                        hm.put(DESCRIPTION, atm.getString("datet")); // Описание

                        if (atm.getString("Status").equals("1")) {
                            hm.put(ICON, R.drawable.circle_green);}
                        else
                        {hm.put(ICON, R.drawable.circle_red);}// Картинка

                        mCatList.add(hm);

                        String Atmid = atm.getString("ATMID");
                        String Atmname = atm.getString("Name");
                        String Status = atm.getString("Status");
                        String Datet = atm.getString("datet");

                        Log.d(LOG_TAG, "atmid: " + Atmid);
                        Log.d(LOG_TAG, "atmname: " + Atmname);
                        Log.d(LOG_TAG, "Status: " + Status);
                        Log.d(LOG_TAG, "Datet: " + Datet);
                    }


                    Log.d(LOG_TAG, "SimpleAdapter");
                    SimpleAdapter adapter = new SimpleAdapter(
                            MainActivity.this,
                            mCatList,
                            R.layout.list_item,
                            new String[]{TITLE, DESCRIPTION, ICON},
                            new int[]{R.id.text1, R.id.text2, R.id.img});
                    iptlist.setAdapter(adapter);


                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }


    public void sayHello(View V) throws JSONException {
        Log.d(LOG_TAG,"Пробуем заполнить ListView");



    }

    public void showname(View V) {

        Toast.makeText(getApplicationContext(),
                "", Toast.LENGTH_LONG).show();

    }
    public void showpr(View V) throws JSONException {

    }





 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
     getMenuInflater().inflate(R.menu.menu_main, menu);
     return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item1: {
                //Кнопка обновления
                Log.d(LOG_TAG,"Кнопка обновления");
                


ВОТ ТУТ не могу получить ListView, который находится на atmActivity
                





            }
                return true;

            case R.id.item2:
                Toast.makeText(getApplicationContext(),
                        "", Toast.LENGTH_LONG).show();
                return true;
        }


        return super.onOptionsItemSelected(item);
    }
}



 

Заранее спасибо!

Ответ:
Здравствуйте!
Надеюсь вы мне поможете!
Структура программы:
MainActivity, сверху заголовок программы, два Item-а основного меню (обновить, настройки), TabHost.
При запуске в Tabhost создаются 2 вкладки и привязываются 2 класса как содержимое вкладок.
На первой кладке Listview (до второй еще не дошел), при создании вкладки Listview заполняется.
Заполняется через AsyncTask (запрос на сайт, парсинг JSON)...

Сейчас у меня стоит задача отработать кнопку обновления данных.

Т.е. у меня не получается обратиться к ListView-у из MainActivity (на нем расположена кнопка "Обновить" в main_menu), который расположен в другом activity на вкладке TabHost.

Возможно я изначально не правильно сделал архитектуру приложения. Конечно я могу сделать кнопку "обновить" для каждой вкладки по отдельности, но мне кажется это будет не красиво.

Подскажите правильный путь...

Вот MainActivity:

Код

package com.example.user.myapplication;

import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONArray;

import android.app.LocalActivityManager;
import android.app.TabActivity;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.SimpleAdapter;
import android.widget.TabHost;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;

import java.io.InputStream;
import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;


public class MainActivity extends AppCompatActivity {

    public static String LOG_TAG = "my_log";
    private ArrayList<HashMap<String, Object>> mCatList;
    private static final String TITLE = "catname"; // Верхний текст
    private static final String DESCRIPTION = "description"; // ниже главного
    private static final String ICON = "icon";  // будущая картинка

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);





        TabHost tabHost = (TabHost) findViewById(R.id.tabHost);
        Log.d(LOG_TAG, "Setup");

        LocalActivityManager mLocalActivityManager = new LocalActivityManager(this, false);
        //setup(mLocalActivityManager);
        mLocalActivityManager.dispatchCreate(savedInstanceState);
        tabHost.setup(mLocalActivityManager);
        TabHost.TabSpec spec;
        Log.d(LOG_TAG, "TabSpec spec");
        spec = tabHost.newTabSpec("tag1");
        Log.d(LOG_TAG, "setContent");

        spec.setContent(new Intent(this,atmActivity.class));


        Log.d(LOG_TAG, "setIndicator");
        spec.setIndicator("TAB 1");
        Log.d(LOG_TAG, "addTab");
        tabHost.addTab(spec);

        Log.d(LOG_TAG, "TabSpec spec");
        spec = tabHost.newTabSpec("tag2");
        Log.d(LOG_TAG, "setContent");

        //spec.setContent(R.id.tab2);

        spec.setContent(new Intent(this,iptActivity.class));
        Log.d(LOG_TAG, "setIndicator");
        spec.setIndicator("TAB 2");
        Log.d(LOG_TAG, "addTab");
        tabHost.addTab(spec);

        tabHost.setCurrentTab(0);


       // new ParseTask().execute();
    }
        private class ParseTask extends AsyncTask<Void, Void, String> {

            HttpURLConnection urlConnection = null;
            BufferedReader reader = null;
            String resultJson = "";

            @Override
            protected String doInBackground(Void... params) {
                // получаем данные с внешнего ресурса
                try {
                    Log.d(LOG_TAG,"получаем данные с внешнего ресурса");
                    URL url = new URL("_Здесь URL, получаю JSON данные_");

                    urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.setRequestMethod("GET");
                    urlConnection.connect();

                    InputStream inputStream = urlConnection.getInputStream();
                    StringBuffer buffer = new StringBuffer();

                    reader = new BufferedReader(new InputStreamReader(inputStream));

                    String line;
                    while ((line = reader.readLine()) != null) {
                        buffer.append(line);
                    }
                    Log.d(LOG_TAG,"Получили данные");
                    resultJson = buffer.toString();

                } catch (Exception e) {
                    e.printStackTrace();
                }
                return resultJson;
            }

            @Override
            protected void onPostExecute(String strJson) {
                super.onPostExecute(strJson);
                // выводим целиком полученную json-строку
                Log.d(LOG_TAG, strJson);

                JSONObject dataJsonObj = null;


                try {
                    dataJsonObj = new JSONObject(strJson);
                    JSONArray atms = dataJsonObj.getJSONArray("atm");

                    ListView iptlist = (ListView) findViewById(R.id.iptlist);

                    mCatList = new ArrayList<HashMap<String, Object>>();
                    HashMap<String, Object> hm;



                  
                    for (int i = 0; i < atms.length(); i++) {
                        JSONObject atm = atms.getJSONObject(i);

                        hm = new HashMap<>();
                        hm.put(TITLE, atm.getString("ATMID")+" "+atm.getString("Name")); // Название
                        hm.put(DESCRIPTION, atm.getString("datet")); // Описание

                        if (atm.getString("Status").equals("1")) {
                            hm.put(ICON, R.drawable.circle_green);}
                        else
                        {hm.put(ICON, R.drawable.circle_red);}// Картинка

                        mCatList.add(hm);

                        String Atmid = atm.getString("ATMID");
                        String Atmname = atm.getString("Name");
                        String Status = atm.getString("Status");
                        String Datet = atm.getString("datet");

                        Log.d(LOG_TAG, "atmid: " + Atmid);
                        Log.d(LOG_TAG, "atmname: " + Atmname);
                        Log.d(LOG_TAG, "Status: " + Status);
                        Log.d(LOG_TAG, "Datet: " + Datet);
                    }


                    Log.d(LOG_TAG, "SimpleAdapter");
                    SimpleAdapter adapter = new SimpleAdapter(
                            MainActivity.this,
                            mCatList,
                            R.layout.list_item,
                            new String[]{TITLE, DESCRIPTION, ICON},
                            new int[]{R.id.text1, R.id.text2, R.id.img});
                    iptlist.setAdapter(adapter);


                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }


    public void sayHello(View V) throws JSONException {
        Log.d(LOG_TAG,"Пробуем заполнить ListView");



    }

    public void showname(View V) {

        Toast.makeText(getApplicationContext(),
                "", Toast.LENGTH_LONG).show();

    }
    public void showpr(View V) throws JSONException {

    }





 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
     getMenuInflater().inflate(R.menu.menu_main, menu);
     return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item1: {
                //Кнопка обновления
                Log.d(LOG_TAG,"Кнопка обновления");
                


ВОТ ТУТ не могу получить ListView, который находится на atmActivity
                





            }
                return true;

            case R.id.item2:
                Toast.makeText(getApplicationContext(),
                        "", Toast.LENGTH_LONG).show();
                return true;
        }


        return super.onOptionsItemSelected(item);
    }
}



 

Заранее спасибо!

Вопрос: "Динамические" кнопки в игре

Добрый день,
хочу написать мини приложение, игра "пятнашки"
16 кнопок(одна пустая),необходимо менять местами пока не выстроим в правильном порядке от 1 до 16
возникла проблема "перемещения, движения" именно button-ов по клику(как поменять местами 2 кнопки)
инициализирую кнопки, потом onClick, а вот дальше...Подскажите пожалуйста
Спасибо
Ответ: меняй текст на кнопках да и все