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

Ребят запутался я совсем. Помогите разобраться.
Насколько я знаю при повороте удаляется активити, а соответственно все размещенные на ней фрагменты.
У меня на активити фрагменты выставляются в FragmentPagerAdapter'ом

При помощи точек останова я отследил вот что:
при первом запуске:
1) в активити - onCreate (в нем создается FragmentPagerAdapter в котором создаются объект фрагмента)
2) во фрагменте - onCreate
3) во фрагменте - onCreateView

Все вроде замечательно...
Поворачиваем экран.
1) во фрагменте - onDestroy
2) во фрагменте - onCreate
3) в активити - onCreate
4) во фрагменте - onCreateView

Вот тут то я и встал ... почему 3 пункт был после 2???
Посмотрел везде по жизненным циклам сначала создается Активити. И при уничтожении активити (а это при получается при повороте) уничтожаются и все фрагменты приаттаченные к нему.

Надеюсь на вашу помощь.
Спасибо.

Добавлено через 1 час 50 минут
В продолжение темы сделал отдельный проект.. с записями на каждое действие:

Запустил....
03-15 16:47:19.038 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onCreate
03-15 16:47:19.038 20042-20042/ru.ant.lifecycletest D/myLogs: Adapter init
03-15 16:47:19.044 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onStart
03-15 16:47:19.045 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onResume
03-15 16:47:19.083 20042-20042/ru.ant.lifecycletest D/myLogs: Adapter getItem
03-15 16:47:19.085 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onAttach
03-15 16:47:19.085 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onCreate
03-15 16:47:19.087 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onCreateView

----------------------
Перевернул.....
03-15 16:47:28.265 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onPause
03-15 16:47:28.265 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onPause
03-15 16:47:28.269 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onSaveInstanceState
03-15 16:47:28.269 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onStop
03-15 16:47:28.269 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onStop
03-15 16:47:28.269 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onDestroyView
03-15 16:47:28.272 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onDestroy
03-15 16:47:28.272 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onDetach
03-15 16:47:28.272 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onDestroy
03-15 16:47:28.324 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onAttach
03-15 16:47:28.324 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onCreate

03-15 16:47:28.339 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onCreate
03-15 16:47:28.339 20042-20042/ru.ant.lifecycletest D/myLogs: Adapter init
03-15 16:47:28.347 20042-20042/ru.ant.lifecycletest D/myLogs: Fragment onCreateView
03-15 16:47:28.347 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onStart
03-15 16:47:28.348 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onRestoreInstanceState
03-15 16:47:28.349 20042-20042/ru.ant.lifecycletest D/myLogs: Activity onResume

Выделил красным... Почему? Если мы видим выше что Фрагмент уничтожен, активити уничтожено... Как мертвый фрагмент прицепляется и запускает метод onCreate?? Причем посмотрел что передает в параметре типа Context в onAttach, там передается уже другой объект активити.

Добавлено через 12 минут
PS При этом если выйти из приложения кнопкой назад . а потом заново зайти будет как будто запустил заново приложение.
Ответ: Вот такая ситуация если поставить лог до супер в onCreate в активити. Тут вообще мрак ... onResume вылезает до onCreate. Причем 2 раза ) И все равно создание фрагмента вылезает вперед даже СуперКласса onCreate у активити...

03-16 11:44:18.617 7370-7370/ru.ant.lifecycletest D/myLogs: Activity onResume
03-16 11:44:18.683 7370-7370/ru.ant.lifecycletest D/myLogs: Activity onCreate
03-16 11:44:18.683 7370-7370/ru.ant.lifecycletest D/myLogs: Adapter init
03-16 11:44:18.688 7370-7370/ru.ant.lifecycletest D/myLogs: Activity onStart
03-16 11:44:18.690 7370-7370/ru.ant.lifecycletest D/myLogs: Activity onResume
03-16 11:44:18.728 7370-7370/ru.ant.lifecycletest D/myLogs: Adapter getItem
03-16 11:44:18.729 7370-7370/ru.ant.lifecycletest D/myLogs: Fragment onAttach
03-16 11:44:18.729 7370-7370/ru.ant.lifecycletest D/myLogs: Fragment onCreate
03-16 11:44:18.730 7370-7370/ru.ant.lifecycletest D/myLogs: Fragment onCreateView
03-16 11:44:18.731 7370-7370/ru.ant.lifecycletest D/myLogs: Fragment onActivityCreated
перевернул
03-16 11:44:34.772 7370-7370/ru.ant.lifecycletest D/myLogs: Fragment onPause
03-16 11:44:34.772 7370-7370/ru.ant.lifecycletest D/myLogs: Activity onPause
03-16 11:44:34.804 7370-7370/ru.ant.lifecycletest D/myLogs: Activity onSaveInstanceState
03-16 11:44:34.805 7370-7370/ru.ant.lifecycletest D/myLogs: Fragment onStop
03-16 11:44:34.805 7370-7370/ru.ant.lifecycletest D/myLogs: Activity onStop
03-16 11:44:34.805 7370-7370/ru.ant.lifecycletest D/myLogs: Fragment onDestroyView
03-16 11:44:34.805 7370-7370/ru.ant.lifecycletest D/myLogs: Fragment onDestroy
03-16 11:44:34.805 7370-7370/ru.ant.lifecycletest D/myLogs: Fragment onDetach
03-16 11:44:34.805 7370-7370/ru.ant.lifecycletest D/myLogs: Activity onDestroy
03-16 11:44:34.819 7370-7370/ru.ant.lifecycletest D/myLogs: Activity onResume
03-16 11:44:34.821 7370-7370/ru.ant.lifecycletest D/myLogs: Fragment onAttach
03-16 11:44:34.821 7370-7370/ru.ant.lifecycletest D/myLogs: Fragment onCreate
03-16 11:44:34.839 7370-7370/ru.ant.lifecycletest D/myLogs: Activity onCreate
03-16 11:44:34.839 7370-7370/ru.ant.lifecycletest D/myLogs: Adapter init
03-16 11:44:34.842 7370-7370/ru.ant.lifecycletest D/myLogs: Fragment onCreateView
03-16 11:44:34.842 7370-7370/ru.ant.lifecycletest D/myLogs: Fragment onActivityCreated
03-16 11:44:34.842 7370-7370/ru.ant.lifecycletest D/myLogs: Activity onStart
03-16 11:44:34.843 7370-7370/ru.ant.lifecycletest D/myLogs: Activity onRestoreInstanceState
03-16 11:44:34.844 7370-7370/ru.ant.lifecycletest D/myLogs: Activity onResume

Добавлено через 9 часов 19 минут
Вообщем кажется я нашел преступничка, господа
Это FragmentPagerAdapter шалит и при повороте без ведома создает автоматом новые фрагменты, без прохождения процедуры инициализации.
Вот с такой же проблемой



Вот это
Java
1
FragmentPageAdapter.getItem(int position)
Заменил на это:
Java
1
FragmentPageAdapter.instantiateItem(GroupView view, int position)
При этом получает объект реально установленного фрагмента

Может кому пригодится
Вопрос: Создание суперкласса для всех Activity

Господа,доброго времени суток!
Возник следующий вопрос: у меня есть несколько активностей(activity1, activity2, activity3), каждая из них содержит по одному фрагменту(fragment1, fragment2, fragment3).
Возможно ли и имеет ли смысл создать некую супер-Activity с фрагментом, наследники которой смогут реализовывать свои специфичные activity+fragment ?
Ответ: Ничего лучше не придумал как создать вот такой вот супер класс для Activity с одним фрагментом.

Код 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
public abstract class BaseActivityWithOneFragment extends FragmentActivity {
 
    Fragment fragment;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(setActivityLayout());
 
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        if (fragment != null) {
        fragment = initFragment();
        fragmentTransaction.add(setContainerForFragment(), fragment, "fragment");
        fragmentTransaction.commit();
        } else {
             Log.d("DEBUG", "В методе initFragment() не проинициализирован объект фрагмента")
        }
    }
    
    /** Класс-наследник должен вернуть разметку для Activity */
    protected abstract int setActivityLayout();
 
    /** Класс-наследник должен вернуть id контейнера,куда поместится фрагмент */
    protected abstract int setContainerForFragment();
 
    /** Класс-наследник должен вернуть объект фрагмента,который будет вешаться на Activity */
    protected abstract Fragment initFragment();
Вопрос: Ошибка при переходе на новое Activity

Здравствуйте, уважаемые программисты! Не могли бы вы мне помочь?

При переходе на новое активити программа выдает ошибку и вылетает. Я начал эксперементировать с методами жизненного цикла активити (onStop, onRestart и т.д.) и в итоге наколдовал что не правильное... Только не могу понять, где ошибка, подскажите, пожалуйста!

Вот код:
Код 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
public class list extends Activity
{
    final LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
    final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    final int pg = Gravity.CENTER_HORIZONTAL;
    final TextView password = new TextView(this);
    final String[] j = new String[50];
    int i = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list);
        for (int ii = 0; ii <= 50; ++ii) {
            if (j[ii].equals(null)) {
                j[ii] = getIntent().getStringExtra("pass");
                password.setText(j[ii]);
                ll.addView(password, lp);
                i = ii;
                break;
            }
            else {
                password.setText(j[ii]);
                ll.addView(password, lp);
            }
        }
    }
    protected void onStop(Bundle savedInstanceState) {
        j[i] = getIntent().getStringExtra("pass");
    }
 
 
}
ЗАРАНЕЕ БЛАГОДАРЮ!!!!!!!!!
Ответ: Спасибо, все заработало!
Вопрос: 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);
    }
}



 

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

Вопрос: Взаимодействие Fragment-ов через Activity (interface)

Ребята гляньте пожалуйста не замыленным глазом на код.
Пытаюсь понять как организовать взаимодействие фрагментов с помощью активити через интерфейс, но "...что-то пошло не так...", второй день смотрю и не вижу.
Цель:
на первом фрагменте есть TextView и Button - который запускает второй фрагмент
на втором EditText и Button - который передает введенный текст первому фрагменту

Сделал:
фрагменты запускаются как нада, но текст из 2ого фрагмента не отображается на первом.
ошибок не высвечиваются


Activity
Кликните здесь для просмотра всего текста
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
43
44
package com.example.jack.interfacecallbackfragment;
 
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
 
public class MainActivity extends AppCompatActivity implements FirstFragment.CallBackFirstFragment, SecondFragment.CallBackSecondFragment {
    FirstFragment firstFragment;
    SecondFragment secondFragment;
    FragmentManager fragmentManager;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        firstFragment = FirstFragment.newInstance();
        secondFragment = SecondFragment.newInstance();
        fragmentManager = getFragmentManager();
        if (savedInstanceState == null) {
            fragmentManager.beginTransaction()
                    .add(R.id.fragment, firstFragment, FirstFragment.TAG_FRAGMENT)
                    .addToBackStack(null)
                    .commit();
        }
    }
 
    @Override
    public void createFragment2() {
        getFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment, secondFragment)
                .commit();
    }
 
    @Override
    public void sendMessageFromFirstFragment(String msg) {
        fragmentManager.beginTransaction()
                .replace(R.id.fragment, firstFragment)
                .commit();
        if (firstFragment != null) {
            firstFragment.editTextView(msg);
        }
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.jack.interfacecallbackfragment.MainActivity">
 
    <FrameLayout
        android:id="@+id/fragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>

FirstFragment
Кликните здесь для просмотра всего текста
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.example.jack.interfacecallbackfragment;
 
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
 
/**
 * Created by jack on 23.01.16.
 */
public class FirstFragment extends Fragment {
    public static final String TAG_FRAGMENT = "first fragment";
 
    TextView tv;
    Button btn;
    CallBackFirstFragment callBackFirstFragment;
    private String SAVE_TAG = "save";
 
    public static FirstFragment newInstance() {
        FirstFragment firstFragment = new FirstFragment();
        return firstFragment;
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_first, container, false);
        return view;
    }
 
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        initInterface();
        initView(view);
        initListener();
 
    }
 
    private void initInterface() {
        callBackFirstFragment = (CallBackFirstFragment) getActivity();
    }
 
    private void initView(View view) {
        tv = (TextView) view.findViewById(R.id.tv);
        btn = (Button) view.findViewById(R.id.btn_second_fragment);
    }
 
    private void initListener() {
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                callBackFirstFragment.createFragment2();
            }
        });
    }
 
    public void editTextView(String string) {
        tv.setText(string);
    }
 
    public interface CallBackFirstFragment {
        void createFragment2();
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
 
    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="text geting from second fragment" />
 
    <Button
        android:id="@+id/btn_second_fragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Start Second Fragment" />
</LinearLayout>

SecondFragment
Кликните здесь для просмотра всего текста
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.example.jack.interfacecallbackfragment;
 
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
 
public class SecondFragment extends Fragment {
 
    public static final String TAG_FRAGMENT = "second fragment";
    CallBackSecondFragment callBackSecondFragment;
    private TextView et;
    private Button btn;
 
    public static SecondFragment newInstance() {
        return new SecondFragment();
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_second, container, false);
    }
 
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        initInterface();
        initView(view);
        initListener();
 
    }
 
    private void initInterface() {
        callBackSecondFragment = (CallBackSecondFragment) getActivity();
    }
 
    private void initView(View view) {
        et = (TextView) view.findViewById(R.id.et);
        btn = (Button) view.findViewById(R.id.btn_send);
    }
 
    private void initListener() {
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                callBackSecondFragment.sendMessageFromFirstFragment(et.getText().toString());
            }
        });
    }
 
 
    public interface CallBackSecondFragment {
        void sendMessageFromFirstFragment(String msg);
    }
 
 
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
 
    <EditText
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="enter message" />
 
    <Button
        android:id="@+id/btn_send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="send message from first fragment" />
</LinearLayout>
Ответ: Спасибо! теперь понял (наверное) как работает жизненый цикл фрагмента.
то как вы сказали - работает.
Вопрос: Как добавить фрагменты в Tabbed Activity (Андроид Студио)?

Добрый день. Хочу сделать в Андроид Студио листалку на шаблоне Tabbed Activity. Когда добавляла этот шаблон, Студия автоматически создала саму листалку-pager (activity_main_activity2) и один фрагмент (fragment_main_activity2). Теперь когда листаю, три раза пролистывается один и тот же фрагмент. Как привязать другие фрагменты к pager'у?
Я создала еще один фрагмент, но не знаю, как его присоединить. Наверное, ссылку на него нужно как-то вставить сюда(это класс pager'а)?
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
                case 0:
                    return getString(R.string.title_section1).toUpperCase(l);
                case 1:
                    return getString(R.string.title_section2).toUpperCase(l);
                case 2:
                    return getString(R.string.title_section3).toUpperCase(l);
            }
            return null;
        }
    }
А вот класс pager'а полностью:

Код 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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import java.util.Locale;
 
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.FragmentPagerAdapter;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
 
 
public class MainActivity2 extends ActionBarActivity {
 
    /**
     * The {@link android.support.v4.view.PagerAdapter} that will provide
     * fragments for each of the sections. We use a
     * {@link FragmentPagerAdapter} derivative, which will keep every
     * loaded fragment in memory. If this becomes too memory intensive, it
     * may be best to switch to a
     * {@link android.support.v4.app.FragmentStatePagerAdapter}.
     */
    SectionsPagerAdapter mSectionsPagerAdapter;
 
    /**
     * The {@link ViewPager} that will host the section contents.
     */
    ViewPager mViewPager;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity2);
 
 
        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
 
        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);
 
    }
 
 
    @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_activity2, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
 
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
 
        return super.onOptionsItemSelected(item);
    }
 
 
    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */
    public class SectionsPagerAdapter extends FragmentPagerAdapter {
 
        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }
 
        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a PlaceholderFragment (defined as a static inner class below).
            return PlaceholderFragment.newInstance(position + 1);
        }
 
        @Override
        public int getCount() {
            // Show 3 total pages.
            return 3;
        }
 
        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
                case 0:
                    return getString(R.string.title_section1).toUpperCase(l);
                case 1:
                    return  getString(R.string.title_section2).toUpperCase(1);
                case 2:
                    return getString(R.string.title_section3).toUpperCase(l);
            }
            return null;
        }
    }
 
    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        private static final String ARG_SECTION_NUMBER = "section_number";
 
        /**
         * Returns a new instance of this fragment for the given section
         * number.
         */
        public static PlaceholderFragment newInstance(int sectionNumber) {
            PlaceholderFragment fragment = new PlaceholderFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }
 
        public PlaceholderFragment() {
        }
 
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main_activity2, container, false);
            return rootView;
        }
    }
 
}
В общем, подскажите, пожалуйста, как это сделать?
Ответ:
Сообщение от Spelcrawler
Можно удалить строку import android.app.fragment, потом навести курсор на красный текст Fragment, нажать ctrl + enter и выбрать в списке строку в которой есть слово support.
Получилось! Заменила во фрагментах import android.app.fragment на import android.support.v4.app.Fragment и все заработало! Огромное спасибо)
Вопрос: Android Studio - Navigation Drawer Activity, многостраничное

Всем доброго времени суток)
Справедливости ради, хочу сказать, что я не сразу стал создавать тему, столкнувшись с проблемой. Два дня я искал по различным видеоурокам и сайтам ее решение, но безрезультатно( Поэтому прошу Вашей помощи, форумчане.

С Navigation Drawer Activity вроде все понятно. С фрагментами (пунктами навигации) тоже вроде ясно. Но у меня многостраничное приложение, поэтому столкнулся с проблемой. Если создавать новое Navigation Drawer Activity, то студия ругается, что мол меню навигации уже есть. Оно и логично.
А если приложение многостраничное, то как на каждой странице вставить меню? Создал Empty Activity, попробовал вставить меню (android.support.design.widget.NavigationView + include), но что-то не вышло. В app_bar_activity нужно include content_xxx. Это то есть, на всех страницах, где я захочу вставить меню, мне придется создавать по два активити на страницу? Просто активити и контент?

Может и вопрос глупый, и мое описание тоже, поэтому просто напишу суть: Как создать, n-страничное приложение, и чтобы на каждой странице было одно и то же меню?
Ответ: Пробовал прописывать import android.support.v4.app.Fragment, не помогло

Добавлено через 1 час 44 минуты
Решил проблему. Надо было во фрагменте исправить import android.support.v4.app.Fragment; на import android.app.Fragment;
Вопрос: Поворот экрана и пересоздание обьектов. Как делают матёрые разработчики?

Разрабатываю приложение, решил делать одно активити и FrameLayout в нем, куда будут помещаться фрагменты (настройки, диалоги и т.д.). Все конечно хорошо, но когда дело доходит до поворота экрана, начинается сущий ад. Создается несколько фрагментов и я их сохраняю в фрагмент менеджер и после поворота экрана восстанавливаю. Но когда начинаю поворачивать экран и переходить между фрагментами по Back Stack в разных вариациях, приложение падает с исключением. Пробовал и так и сяк делать сохранение и восстановление, но исключение неумолимо.

Как вообще реализовывают в сложных программах пересоздание фрагментов? Ибо при моем подходе, делать обработку для каждого фрагмента, можно рехнуться.
Решил попробовать отключить пересоздание в манифесте через android:configChanges="keyboardHidden|orientation|screenSize", стало сразу на много проще, но везде пишут, что этот метод не рекомендован и что нужно обновлять в ручную какие то данные. Разжуйте стоит ли этот метод использовать или нет?
Ну и хотелось бы услышать опытных разработчиков, как бороться с пересозданием с минимальными затратами.
Ответ: xaat, решил встрять в диалог, если позволите.
Я часто использую фрагменты, особенно, если нужен Navigation Drawer (ибн "боковое меню"). Читал статейку на "Хабре", где одна контора решила от них отказаться, потому как соотношение жизненных циклов и правда очень разветвлённое, а количество проблем пропорционально 2^n (n - кол-во фрагментов).
Активно используйте DialogFragment на замену AlertDialog и прочих Dialog.
Вопрос: Использование Fragment в Activity

Здравствуйте, делаю модуль для регистрации юзера, она прозодит в несколько этапов, сначала вводится номер, потом личные данные, потом дополнительная инфа... для этого юзаю одну Activity, с вводом номера, потом через FragmentManager.beginTransaction().replace отображаю фрагмент для ввода личной инфы, с него также следующий, но при нажатии на пустое место фрагмента нажимается EditText Activity, каекой правельный способ реализации такого взаемодействия? Или лучше использовать несколько активити?

PS. Русский не родной)
Ответ:
Сообщение от ivan_petrenko
но при нажатии на пустое место фрагмента нажимается EditText Activity, каекой правельный способ реализации такого взаемодействия?
Ничего не понятно. Вот перешли на какой-то фрагмент, дальше что надо сделать? Обратно вернуть данные или что?
Вопрос: Activity и Fragment

Всем добрый вечер. Создал приложение новостей с 2 Activity и 1 Adapter. Сейчас решил в проект добавить нижнее меню (Bottom Navigation View). Но такое меню работает только с фрагментами. Помогите исправить мои коды так, чтобы из активити получились фрагменты.

NewsActivity (это главная страница со списком новостей):
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 
public class NewsActivity extends AppCompatActivity {
 
    private final String JSON_URL = "https://pastebin.com/raw/VnmRzcFP";
    private JsonArrayRequest request;
    private RequestQueue requestQueue;
    private List<News> listNews;
    private RecyclerView recyclerView;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news);
 
    listNews = new ArrayList<>();
        recyclerView = findViewById(R.id.recyclerviewid);
        jsonrequest();
 
    }
 
    private void jsonrequest() {
 
        request = new JsonArrayRequest(JSON_URL, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
 
                JSONObject jsonObject = null;
 
                for (int i = 0; i < response.length(); i++) {
 
                    try {
                        jsonObject = response.getJSONObject(i);
                        News news = new News();
                        news.setName(jsonObject.getString("name"));
                        news.setInfo(jsonObject.getString("info"));
                        news.setSummary(jsonObject.getString("summary"));
                        news.setDate(jsonObject.getString("date"));
                        news.setImage_url(jsonObject.getString("image"));
                        listNews.add(news);
 
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
 
                }
 
                setuprecyclerview(listNews);
 
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
 
            }
        });
 
        requestQueue = Volley.newRequestQueue(NewsActivity.this);
        requestQueue.add(request);
 
    }
 
    private void setuprecyclerview(List<News> listNews) {
 
        RecyclerViewAdapter myadapter = new RecyclerViewAdapter(this, listNews);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
 
        recyclerView.setAdapter(myadapter);
 
    }
}
News_Info_Activity (это страница определённой новости с полным описанием):
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
public class News_Info_Activity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news__info);
 
        getSupportActionBar().hide();
 
        String name = getIntent().getExtras().getString("news_name");
        String info = getIntent().getExtras().getString("news_info");
        String image_url = getIntent().getExtras().getString("news_image");
 
        CollapsingToolbarLayout collapsingToolbarLayout = findViewById(R.id.collapsingtoolbar_id);
        collapsingToolbarLayout.setTitleEnabled(true);
 
        TextView tv_name = findViewById(R.id.aa_news_name);
        TextView tv_info = findViewById(R.id.aa_news_info);
        ImageView img = findViewById(R.id.aa_thumbnail);
 
        tv_name.setText(name);
        tv_info.setText(info);
 
 
        RequestOptions requestOptions = new RequestOptions().centerCrop().placeholder(R.drawable.loading_shape).error(R.drawable.loading_shape);
 
 
        Glide.with(this).load(image_url).apply(requestOptions).into(img);
 
    }
}
RecyclerAdapter:
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
 
    private Context mContext;
    private List<News> mData;
    RequestOptions option;
 
    public RecyclerViewAdapter(Context mContext, List<News> mData) {
        this.mContext = mContext;
        this.mData = mData;
 
        option = new RequestOptions().centerCrop().placeholder(R.drawable.loading_shape).error(R.drawable.loading_shape);
 
    }
 
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
 
        View view;
        LayoutInflater inflater = LayoutInflater.from(mContext);
        view = inflater.inflate(R.layout.news_row_item, parent, false);
        final MyViewHolder viewHolder = new MyViewHolder(view);
        viewHolder.view_container.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
 
                Intent i = new Intent(mContext, News_Info_Activity.class);
                i.putExtra("news_name", mData.get(viewHolder.getAdapterPosition()).getName());
                i.putExtra("news_info", mData.get(viewHolder.getAdapterPosition()).getInfo());
                i.putExtra("news_date", mData.get(viewHolder.getAdapterPosition()).getDate());
                i.putExtra("news_summary", mData.get(viewHolder.getAdapterPosition()).getSummary());
                i.putExtra("news_image", mData.get(viewHolder.getAdapterPosition()).getImage_url());
 
                mContext.startActivity(i);
 
            }
        });
 
        return viewHolder;
    }
 
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
 
        holder.tv_name.setText(mData.get(position).getName());
        holder.tv_summary.setText(mData.get(position).getSummary());
        holder.tv_date.setFormat24Hour(mData.get(position).getDate());
 
        Glide.with(mContext).load(mData.get(position).getImage_url()).apply(option).into(holder.image_thumbnail);
 
    }
 
 
    @Override
    public int getItemCount() {
        return mData.size();
    }
 
    public static class MyViewHolder extends RecyclerView.ViewHolder {
 
        TextView tv_name;
        TextView tv_summary;
        TextClock tv_date;
        ImageView image_thumbnail;
        RelativeLayout view_container;
 
        public MyViewHolder(View itemView) {
            super(itemView);
 
            view_container = itemView.findViewById(R.id.container);
 
            tv_name = itemView.findViewById(R.id.news_name);
            tv_summary = itemView.findViewById(R.id.news_summary);
            tv_date = itemView.findViewById(R.id.news_date);
            image_thumbnail = itemView.findViewById(R.id.thumbnail);
 
        }
    }
 
}
Ответ:
Очень полезная информация. Сделал, как в примере, работает, но есть 1 маленькая проблемка в дизайне. Может вы поймёте почему так и как исправить. Проблема в том, что моё Activity новостей уходит за фон меню (скрин прилагается).

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
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <TabHost
        android:id="@android:id/tabhost"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
 
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
 
            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_alignParentStart="true"
                android:layout_alignParentTop="true"></FrameLayout>
 
            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:background="@color/colorAccent"
                android:layout_alignParentBottom="true"></TabWidget>
 
        </RelativeLayout>
    </TabHost>
</LinearLayout>
Список новостей:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activities.NewsActivity">
 
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerviewid"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
 
    </android.support.v7.widget.RecyclerView>
 
</LinearLayout>
И шаблон новостей:
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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:layout_marginTop="1dp"
    android:background="#fff"
    android:elevation="3dp"
    android:orientation="horizontal"
    android:id="@+id/container">
 
    <ImageView
        android:id="@+id/thumbnail"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:background="@drawable/loading_shape" />
 
    <TextView
        android:id="@+id/news_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/thumbnail"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="20dp"
        android:padding="3dp"
        android:text="News_Title"
        android:textColor="@android:color/black"
        android:textSize="16sp"
        android:textStyle="bold"
        android:typeface="serif" />
 
    <TextView
        android:id="@+id/news_summary"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignStart="@+id/news_name"
        android:layout_below="@+id/news_name"
        android:layout_marginTop="10dp"
        android:padding="3dp"
        android:text="TextView"
        android:textSize="14sp" />
 
    <TextClock
        android:id="@+id/news_date"
        android:layout_width="65dp"
        android:layout_height="wrap_content"
        android:layout_alignStart="@+id/news_summary"
        android:layout_below="@+id/news_summary"
        android:layout_marginBottom="5dp"
        android:layout_marginTop="5dp"
        android:padding="3dp"
        android:text="News_Date"
        android:textColor="#646464"
        android:textSize="12sp" />
 
</RelativeLayout>