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

Проблема такая:
Я создаю новый класс в отдельном файле для работыSQLite и в нем мне нужен Объект Context, если я наследую Activity
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
 public class DbNumberMessage extends Activity { 
...
dbHelper = new DBHelper(this);
...
 
  class DBHelper extends SQLiteOpenHelper {
        public DBHelper(Context context) {
            super(context, "DB", null, 1);
        }
Программа вываливается с ошибкой: FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity

Пробовал и так:
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
  final DbNumberMessage dbNumberMessage = new DbNumberMessage();
        listMessageStatus=dbNumberMessage.loadDB(this);
_____________________________________________________________________
 
public ArrayList loadDB(Context context){
 
  class DBHelper extends SQLiteOpenHelper {
        public DBHelper(Context context) {
            super(context, "DB", null, 1);
        }
При запуске все работает, если вызываю Activity
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
Intent newintent = new Intent(context, MainActivity.class);
...
context.startActivity(newintent);
Вылетает FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity

Подскажите пожалуйста что я делаю не так...
Ответ: DbHelper не статик класс. Значит и без всяких явных передач туда контекстов имеет доступ до родительской активити, а значит может звать ее методы, в том числе и getApplicationContext(). Хз вернет ли активитя нормальный app контекст до момента вызова своего базового метода onCreate, но то, что контекст активити кривой до этого вызова - это точно:


Код C++
1
2
3
4
5
6
7
8
9
10
void onCreate()
{
   Context appContext = getApplicationContext(); // ??
   Context thisContext = this;  // точно кривой и использовать его нельзя.
 
   super.onCreate();
 
   Context appContext = getApplicationContext(); // ok
   Context thisContext = this;  // ok
}
Если ваши ошибки из-за того, что вы свой хелпер создаете до super.onCreate();, то не делайте так.
Если все же надо именно до super.onCreate();, то попробуйте сперва не this использовать в качестве контекста, а getApplicationContext();, если не поможет - то наверно что-то вроде предложенного тут синглтона надо.
Вопрос: Context - ошибка

Здравствуйте!
Программа должна выводить карту из google. Использую Picasso как самое рациональное решение. При импользовании Picasso надо указывать context:
Java
1
2
3
Picasso.with(context)
                .load("https://maps.googleapis.com/maps/api/staticmap?center=25.3442,17.6113&zoom=16&size=1200x1000&maptype=roadmap&markers=color:blue%7Clabel:A%7C55.5242,37.51285&key=AIzaSyC9h_P0hPC8bYRMi2XtdobHV9WVxrMBCqk")
                .into(googleMap);
Но context выделяет красным. Ошибка: cannot resolve symbol context.
Picasso используется не в родной активности. Эта активность вызывается из родной.
Прошу помочь
Ответ: Mikalai, ну так если не кастуется то о чем речь мы тут ведем? человек хочет предать нечто называемое контекст. я вангую что это Context и возможно переменная context не объявлена, а вы про что)?
Вопрос: Обращение к фрагменту вне активити

Здравствуйте, форумчане!
Назрел такой вот вопрос: создан класс BannerFragment, унаследованный от фрагмента. В нём переопределён OnCreateView(), добавлены пара методов. Далее, есть класс-посредник, в котором задача создать на переданной активити (в переданном контексте) этот самый BannerFragment (также передаётся айдишник фрагмента с лэйаута активити, куда должен поселиться наш фрагмент). Но в этом самом посреднике ловим нуллпоинтер, фрагмент-манагер не хочет с нами сотрудничать=). Как бы обогнуть эту проблему?..
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
public class BannerFragment extends Fragment {
 
    WebView viewer;
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.banner_fragment, container, false);
    }
В принципе, мне понятно, что манагер-то не связан с активностью получается, но как это всё сделать правильно - не доезжаю(.
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
 
 public void show(Context context, String unit_id, int fragmentId){
BannerFragment bannerFragment=new BannerFragment();
 bannerFragment.getFragmentManager().findFragmentById(fragmentId);
 if (bannerFragment.isInLayout()) {
            //bannerFragment.goToLink(link);
            Log.d(TAG, "Fragment is in layout");
        }
}
Активность
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //=============================================================
        final String TOKEN=" ";
        Init init=new Init(this, TOKEN);
        init.show(this, "1", R.id.banner_fragment);
        //=============================================================
    }
Заранее спасибо за помощь=)
Ответ: В классе-посреднике нулл фрагмента. Был=).
Переделала путём передачи не айдишника фрагмента, а самого фрагмента и всё заработало=).
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //=============================================================
        final String TOKEN=" ";
        Init init=new Init(this, TOKEN);//context+token
        Fragment fragment=getFragmentManager().findFragmentById(R.id.banner_fragment);
        init.showAd(this, "1", fragment);
        //=============================================================
    }
Посредник
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
public void showAd(Context context, String unit_id, Fragment fragment){       
        BannerFragment bannerFragment=(BannerFragment)fragment;
        if (bannerFragment.isInLayout()) {
            bannerFragment.goToLink(staticNotFS);
            Log.d(TAG, "Fragment is in layout");
        }
    }
Вопрос: Контекст равен null в АсинкТаске во фрагменте

Хочу что бы при пересоздании Activity не исчезал DialogProgress со статусом выполняемого AsyncTask'а. Для этого AsyncTask вызываю во фрагменте с setRetainInstance(true). ProgressDialog создаётся в классе AsyncTask'а в onPreExecute. При вызове progress=new ProgressDialog(activity.get()) появляется ошибка
Код
Attempt to invoke virtual method 'android.content.res.Resources$Theme android.content.Context.getTheme()' on a null object reference
Код MainActivity
Кликните здесь для просмотра всего текста
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
public class MainActivity extends AppCompatActivity {
 
@BindView(R.id.counter)TextView counter;
private MyAsyncTask2 task;
private static final String MyFragment="MyFragment";
 
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
}
 
@OnClick(R.id.progressDialogButton)
public void showProgressDialog(){
    Log.d("happy","showProgressDialog()");
    task=new MyAsyncTask2(MainActivity.this);
    task.execute();
}
 
@OnClick(R.id.progressFragmentDialogButton)
public void showFragmentProgressDialog(){
    FragmentTaskWrapper myFragment=(FragmentTaskWrapper)
            getSupportFragmentManager().findFragmentByTag(MyFragment);
    if(myFragment==null){
        myFragment=new FragmentTaskWrapper();
        getSupportFragmentManager().beginTransaction().add(myFragment,MyFragment).commit();
    }
    myFragment.startProgress();
}
 
@Override
protected void onPause() {
    super.onPause();
    if(task!=null)task.cancel(false);
}
}

Код FragmentTaskWrapper
Кликните здесь для просмотра всего текста
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
public class FragmentTaskWrapper extends Fragment {
 
private MyAsyncTask2 task;
 
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
    Log.d("happy","FragmentTaskWrapper - onCreate");
}
 
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    Log.d("happy","FragmentTaskWrapper - onCreateView");
    return super.onCreateView(inflater, container, savedInstanceState);
 
}
 
@Override
public void onAttach(Context context) {
    Log.d("happy","FragmentTaskWrapper - onAttach");
    super.onAttach(context);
    task.setActivity((MainActivity)getActivity());
}
 
@Override
public void onDetach() {
    super.onDetach();
    task.setActivity(null);
}
 
public void startProgress(){
    Log.d("happy","FragmentTaskWrapper - startProgress");
    task=new MyAsyncTask2((MainActivity)getActivity());
    task.execute();
}
}

Код MyAsyncTask2
Кликните здесь для просмотра всего текста
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
public class MyAsyncTask2 extends AsyncTask<Void,Integer,Void> {
 
private WeakReference<MainActivity>activity;
private ProgressDialog progress;
 
public MyAsyncTask2(MainActivity activity) {
    Log.d("happy","MyAsyncTask2 - constructor");
    this.activity = new WeakReference<MainActivity>(activity);
}
 
public void setActivity(MainActivity activity){
    if (activity!=null){
        this.activity=new WeakReference<MainActivity>(activity);
    }
    else{
        this.activity=null;
    }
 
}
 
@Override
protected void onPreExecute() {
    Log.d("happy","MyAsyncTask2 - onPreExecute");
    if (activity!=null){
        Log.d("happy","MyAsyncTask2 - onPreExecute IF activity != null");
        progress=new ProgressDialog(activity.get());
        progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progress.setTitle("Progress Dialog");
        progress.setIndeterminate(false);
        progress.setProgress(0);
        progress.setMax(9);
        progress.setCancelable(false);
        progress.show();
    }
}
 
@Override
protected Void doInBackground(Void... params) {
    Log.d("happy","MyAsyncTask2 - doInBackground");
    for (int i=0;i<10;i++){
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        publishProgress(i);
    }
    return null;
}
 
@Override
protected void onProgressUpdate(Integer... values) {
    Log.d("happy","MyAsyncTask2 - onProgressUpdate");
    progress.setProgress(values[0]);
}
 
@Override
protected void onPostExecute(Void aVoid) {
    Log.d("happy","MyAsyncTask2 - onPostExecute");
    if (progress!=null){
        progress.dismiss();
    }
}
}

NPE в классе MyAsyncTask2 в методе onPreExecute
Java
1
progress=new ProgressDialog(activity.get());
Замена на activity.get().getApplicationContext() не даёт эффекта, тот же NPE. Логирующие сообщения в проовераденных методах фрагмента и AsyncTask'a выводятся в следующем порядке:
  • FragmentTaskWrapper - startProgress
  • MyAsyncTask2 - constructor
  • MyAsyncTask2 - onPreExecute
  • MyAsyncTask2 - onPreExecute IF activity != null
Т.е. у фрагмента вообще не вызываются методы
  • onCreate
  • onCreateView (проверрадил тоже, хоть тут headless-фрагмент без разметки, по идее этот метод вообще никак не нужен)
  • onAttach
а сразу вызывается startProgress. Не понимаю в итоге как вообще этот фрагмент заработал. Далее в AsyncTask'е отдельная проверка на null поля activity проходит в методе onPreExecute но далее из этого поля не могу достать контекст.
Почитал про фрагменты поподробнее, да, написано что пока не выполнятся методы onCreate (и/или onCreateView?) этого фрагмента "не существует".

Но как тогда в AsyncTask'е Activity не равна null?
И главное как передать активити или контекст в AsyncTask что бы ProgressDialog можно было создать?
Ответ: кмк в дестройвью во фрагменте надо дотвязать фрагмент от активити,
что то типо такого:
getActivity.getSupportFragmentManager().beginTransaction().remove(myFragment,MyFragment).commit();
Вопрос: Сделать переключение между фрагментами

Здравствуйте.

Подскажите как сделать переключение между фрагментами. Есть 3 фрагмента. на которых размещены кнопки. Как через кнопки сделать переключение между фрагментами?

Код 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
public class MainActivity extends FragmentActivity {
/** идентификатор первого фрагмента. */
public static final int FRAGMENT_ONE = 0;
/** идентификатор второго. */
public static final int FRAGMENT_TWO = 1;
/** идентификатор третего. */
public static final int FRAGMENT_THREE = 2;
/** количество фрагментов. */
public static final int FRAGMENTS = 3;
/** адаптер фрагментов. */
private FragmentPagerAdapter _fragmentPagerAdapter;
/** список фрагментов для отображения. */
private final List<Fragment> _fragments = new ArrayList<Fragment>();
/** сам ViewPager который будет все это отображать. */
private ViewPager _viewPager;
 
@Override
protected void onCreate(final Bundle savedInstanceState) {
 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    // создаем фрагменты.
    _fragments.add(FRAGMENT_ONE, new FirstFragment());
    _fragments.add(FRAGMENT_TWO, new SecondFragment());
    _fragments.add(FRAGMENT_THREE, new TherdFragment());
.....
В классе фрагмента на котором расположена кнопка пишу переход на другой фрагмент:

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
public class SecondFragment extends android.support.v4.app.Fragment {
private Context context;
 
Fragment fragment1;
 
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}
 
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}
 
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    //задаем разметку фрагменту
    final View view = inflater.inflate(R.layout.second, container, false);
    //ну и контекст, так как фрагменты не содержат собственного
    context = view.getContext();
 
    fragment1 = new FirstFragment();
 
    //Knopka 1
    Button button1 = (Button) view.findViewById(R.id.button1);
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.replace(R.id.pager, fragment1);
            transaction.commit();
        }
    });
}
В итоге происходит переход на пустой фрагмент.
Ответ: Все очень просто - через интерфейс.
Создание интерфейса
Java
1
2
3
public interface ViewPagerMovement {
    void moveTo(int position);
}
Имплементим его в Activity и пишем обработчик
Java
1
2
3
4
5
6
7
public class MainActivity extends AppCompatActivity implements ViewPagerMovement{
    @Override
    public void moveTo(int position) {
        viewPager.setCurrentItem(position);
    }
    ... //все остальное 
}
Во фрагменте создаем поле и сеттер для него.
Java
1
2
3
4
5
private ViewPagerMovement viewPagerMovement;
 
    public void setViewPagerMovement(ViewPagerMovement viewPagerMovement) {
        this.viewPagerMovement = viewPagerMovement;
    }
Из Activity передаем ему обработчик при создании этого фрагмента
Java
1
2
3
SecondFragment secondFragment = new SecondFragment();
        secondFragment.setViewPagerMovement(this);
        _fragments.add(FRAGMENT_TWO, secondFragment);
И в нужном месте вызываем
Java
1
2
3
4
5
6
7
8
Button button1 = (Button) view.findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(viewPagerMovement!=null)
                    viewPagerMovement.moveTo(0);
            }
        });
Могут быть синтаксические ошибки, но принцип именно такой.
Вопрос: Вызов разных фрагментов или активити на клиенте по команде сервера

Подскажите пожалуйста направление/примеры/описалово/библиотеки, хоть что нибудь что поможет решить задачу.

Задачи две:
1. Клиент отправляет месагу серверу (типа: хочу получить инфу о предмете), сервер отвечает "открой фрагмент/активити по кличке "кличка" и распарси для него месагу".

2. Сервер не ждет ничего от клиента и самостоятельно инициализирует месагу, клиент после выполнения отсылает ОК.


Переговоры между клиентом и сервером готовы и работают по принципу сервер<-->сервер без проблем.

Остается заставить клиента вести себя адекватно, то есть вызывать фрагмент или активити которое ему указал сервер.

Как организовать?
Ответ: У меня в заготовке так
Код 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
public void showForm(int i, Context context, String type){
        switch(i){
        case 1:
            intent = new Intent(context, loginActivity.class);
            break;
        case 2:
            intent = new Intent(context, mainActivity.class);
            break;
        case 3:
            intent = new Intent(context, workActivity.class);
            break;
        case 4:
            intent = new Intent(context, settingActivity.class);
            break;
        case 5:
            intent = new Intent(context, listViewActivity.class);
            break;
        case 6:
            intent = new Intent(context, addOrChangeListViewActivity.class);
            break;
        }
        intent.putExtra("typeListView", type);
        intent.putExtra(formController.class.getCanonicalName(), this);
        context.startActivity(intent);
    }
Но что с этим делать не знаю.

Точнее не знаю как задействовать.

Добавлено через 15 минут
Вопрос то не в том как и что делать по отдельности, а как создать цепочку

messageListner->parser(message)->НазваниеВызываемогоАктивити из parcer->tokenizer(message минус parser)-setTextView

По отдельности все понятно и вопросов нет.
Вопрос: Вложенные фрагменты

Ребятушки, привет. У меня проблема с вложенными фрагментами. Мое приложение построено так: есть одно главное Activity, а также NawigationDrawer, через который я перехожу на разные фрагменты. Все переходит без проблем. Но вот у меня есть пара фрагментов, через которые я перехожу на еще один фрагмент (фрагмент во фрагменте получается). Что-то типа первый фрагмент со списком новостей, жмешь на какую-либо новость открывается еще один фрагмент с этой одиночной новостью. Все бы ничего, да вот когда жму кнопку назад (телефонную), фрагменты начинают жутко накладываться друг на друга. Если использовать при переходе из фрагмента во фрагмент ChildFragmentManager наложения нет, но тогда я не могу из вложенного фрагмента вернуться в начальный фрагмент. Если использовать FragmentManager, то идет наложение. Кто-нибудь может уже сталкивался с подобной проблемой? Как правильно реализовать вложенный фрагмент?
Ответ:

Не по теме:

вспомнил, я писал тогда не очень красивые конструкции с всякими popBackStack и проверками в onBackPressed количества фрагментов в стеке и так далее
вобщем остался неприятный осадок )
может есть и более простой способ

Вопрос: Переход на нужный фрагмент по нажатию кнопки назад

Здравствуйте, у меня есть 2 фрагмента со списком ListFragment (выбираю категорию и подкатегорию) и еще другие информационные фрагменты, на которые я перехожу с подкатегории ListFragment-а с помощью onListItemClick. Мне нужно чтобы при нажатии на кнопку "назад" я возвращался не по стеку всех открытых фрагментов, а строго так: Категория ← подкатегория ← инфо-Фрагмент. Пробовал ловить с onBackPressed, но не получается, может что-то не так делал. Подскажите как это реализовать, желательно с кодом. Заранее спасибо!!!
Ответ: Да нашел решение. У меня несколько типов фрагментов (где-то 10) и для каждого типа где то 10 фрагментов. Я создал для каждого типа фрагмента свою переменную boolean которая обозначает какой тип фрагмента активен.

Вот эти переменные:
Java
1
2
3
4
5
6
7
8
9
10
    public static boolean firstListFrag;
    public static boolean algebraFormulFrag;
    public static boolean geometryFormulFrag;
    public static boolean trigeometryFormulFrag;
    public static boolean physicalFormulFrag;
    public static boolean himicalFormulFrag;
    public static boolean himicalTablFrag;
    public static boolean physicalTablFrag;
    public static boolean algebraTablFrag;
    public static boolean trigonometryTablFrag;
Затем когда я открываю фрагмент, я там отмечаю что он работает в нужной переменной, а когда выхожу ставлю снова false. Получилось вот так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
@Override
    public void onResume() {
        super.onResume();
        MainActivity.himicalTablFrag = true;
        getActivity().setTitle("Периодическая таблица химических элементов Д. И. Менделеева");
    }
 
    @Override
    public void onPause() {
        super.onPause();
        MainActivity.himicalTablFrag = false;
    }
И так в каждом фрагменте.
А вот в MainActivity в onBackPressed я по этим переменным проверяю какой фрагмент был открыт во время нажатия кнопки назад я заменяю фрагмент с помощью replace(). Вот так:

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
81
82
83
84
85
86
87
88
89
90
91
@Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else if (firstListFrag){
            Fragment fragment;
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
 
            fragment = new MainFragment();
            transaction.replace(R.id.container, fragment);
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
            transaction.commit();
        } else if(algebraFormulFrag){
            Fragment fragment;
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
 
            fragment = new AlgebraFragment();
            transaction.replace(R.id.container, fragment);
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
            transaction.commit();
        } else if(geometryFormulFrag){
            Fragment fragment;
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
 
            fragment = new GeometryFragment();
            transaction.replace(R.id.container, fragment);
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
            transaction.commit();
        } else if(trigeometryFormulFrag){
            Fragment fragment;
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
 
            fragment = new TrigonometryFragment();
            transaction.replace(R.id.container, fragment);
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
            transaction.commit();
        } else if(physicalFormulFrag){
            Fragment fragment;
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
 
            fragment = new PhysicalFragment();
            transaction.replace(R.id.container, fragment);
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
            transaction.commit();
        } else if(himicalFormulFrag){
            Fragment fragment;
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
 
            fragment = new HimicalFragment();
            transaction.replace(R.id.container, fragment);
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
            transaction.commit();
        } else if(himicalTablFrag){
            Fragment fragment;
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
 
            fragment = new HimicalTema_11();
            transaction.replace(R.id.container, fragment);
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
            transaction.commit();
        } else if(physicalTablFrag){
            Fragment fragment;
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
 
            fragment = new PhysicalTema_23();
            transaction.replace(R.id.container, fragment);
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
            transaction.commit();
        } else if(algebraTablFrag){
            Fragment fragment;
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
 
            fragment = new AlgebraTema_10();
            transaction.replace(R.id.container, fragment);
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
            transaction.commit();
        } else if(trigonometryTablFrag){
            Fragment fragment;
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
 
            fragment = new TrigonometryTema_10();
            transaction.replace(R.id.container, fragment);
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
            transaction.commit();
        } else if((!drawer.isDrawerOpen(GravityCompat.START)) && (MainFragment.fragmentShow)){
            alertDialog.show();
        } else {
            super.onBackPressed();
        }
    }
Для каждого типа фрагмента своя замена на нужный фрагмент. Все работает без багов! Пока что это я сделал для своей версии приложения в play маркете, но пока не обновил. Если интересно как это работает могу дать тестовый apk.
Вопрос: Использование Context в других классах

У меня есть диалоговое окно, в котором я использую список. Требуется считать этот список с документа.

Есть метод changeGroup, где массив с документа будет меняться. Требуется передать этот массив в диалоговое окно DialogGroupSelection. Но при использовании метода group из класса Book требуется передать Context. И тут и есть проблема, я не понимаю, что именно надо передать.

Чтобы я не пробовала всегда одна и та же ошибка:
Attempt to invoke virtual method 'android.content.res.AssetManager android.content.Context.getAssets()' on a null object reference.

При этом, если вызывать метод group в MainActivity в onCreate, то ошибок нет.

MainActivity:
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
public class MainActivity extends AppCompatActivity  {
    DialogFragment dlg;
    Book book = new Book();
 
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
 
    // Создаем переменную типа Book
    String[] data = book.group(this); // Так работает нормально
 
    dlg = new DialogGroupSelection();
    dlg.show(getFragmentManager(), "dlg");
 
    }
 
public String[] changeGroup(){
   String[] dat = book.group(); // Какой Context передавать сюда?
   return dat;
}
 
public class Book{
    // В переменную записываем имя файла
    String text = "list.xls";
    InputStream fis;
 
    public String[] group(Context myContext){
        try {
            //Открываем нужный документ
            AssetManager myAsset = myContext.getAssets();
            fis = myAsset.open(text);
 
            // Создаем книгу
            Workbook wb = new HSSFWorkbook(fis);
            int number_sheets = wb.getNumberOfSheets()-1;
 
            //Создаем массив из перых ячеек каждого листа
            String[] group = new String[number_sheets];
            for(int count_list = 0; count_list<number_sheets; count_list++) {
                group[count_list] = wb.getSheetAt(count_list).getRow(0).getCell(0).getStringCellValue();
            }
            return group;
        }
        catch (IOException e){e.printStackTrace();}
    }
}
И диалоговое окно DialogGroupSelection. Код:
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
public class DialogGroupSelection extends DialogFragment implements DialogInterface.OnClickListener {
 
MainActivity mainact = new MainActivity();
String[] list = mainact.changeGroup();
//String[] list = mainact.book.group(); Можно ли обращаться напрямую? И какой Context тогда использовать?
int i=1;
public Dialog onCreateDialog(Bundle savedInstanceState) {
 
    AlertDialog.Builder adb = new AlertDialog.Builder(getActivity());
    adb.setTitle("Выберите свою группу")
            .setSingleChoiceItems(list, -1, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int item) {
                    Toast.makeText(getActivity(), "Ваша группа: " + list[item], Toast.LENGTH_SHORT).show();
                }
            })
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {
                    // User clicked OK, so save the mSelectedItems results somewhere
                    // or return them to the component that opened the dialog
 
                }
            });
    return adb.create();
}
Ответ: Паблито, Спасибо, что помогли разобраться с:
Вопрос: Фрагмент поверх другого

Меняю фрагменты след. кодом:
Кликните здесь для просмотра всего текста
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
public void fragmentChange(int id, boolean addToBackStack){
        FragmentTransaction fTrans = getSupportFragmentManager().beginTransaction();
        switch (id){
            case Constants.PEOPLE_NEAR_DRAWER_ID:
                fTrans.replace(R.id.frgmCont, new PeopleNear(), Constants.PEOPLE_NEAR_FRAGMENT_TAG);
                if (addToBackStack) fTrans.addToBackStack(Constants.PEOPLE_NEAR_FRAGMENT_TAG);
                fTrans.commit();
                break;
            case Constants.FRIEND_DRAWER_ID:
                fTrans.replace(R.id.frgmCont, new PeopleList(), Constants.PEOPLE_LIST_FRAGMENT_TAG);
                if (addToBackStack) fTrans.addToBackStack(Constants.PEOPLE_LIST_FRAGMENT_TAG);
                fTrans.commit();
                break;
            case Constants.SETTINGS_DRAWER_ID:
                fTrans.replace(R.id.frgmCont, new Settings(), Constants.SETTINGS_FRAGMENT_TAG);
                if (addToBackStack) fTrans.addToBackStack(Constants.SETTINGS_FRAGMENT_TAG);
                fTrans.commit();
                break;
            case Constants.SETTINGS_PROFILE_DRAWER_ID:
                fTrans.replace(R.id.frgmCont, new SettingsProfile(), Constants.SETTINGS_PROFILE_FRAGMENT_TAG);
                if (addToBackStack) fTrans.addToBackStack(Constants.SETTINGS_PROFILE_FRAGMENT_TAG);
                fTrans.commit();
                break;
            case Constants.CHAT_LIST_DRAWER_ID:
                fTrans.replace(R.id.frgmCont, new ChatList(), Constants.CHAT_LIST_FRAGMENT_TAG);
                if (addToBackStack) fTrans.addToBackStack(Constants.CHAT_LIST_FRAGMENT_TAG);
                fTrans.commit();
                break;
            case Constants.DIALOG_EXIT_ID:
                System.exit(0);
                break;
        }
    }



Иногда бывает так что один фрагмент встает на другой .. Вроде и делаю replace, а не add.
И я понять не могу какая там закономерность... Не могу сам сымитировать, всегда получается хз после каких действий.. То при восстановлении приложение из свернутого состояния то при смене фрагментов..

У вас бывало такое? Что за бяка? Как исправить?
Ответ:
Сообщение от Паблито
для начала
спасибо

Буду знать
Сообщение от Паблито
в активити находТСЯ фрагмент и в него потом добавляюТСЯ другие?
Да.

Сообщение от Паблито
если так то у фрагментов есть свой метод getChildFragmentManager()
Что я с этим должен делать? при нажатии Back стирать ChildFragment?

Добавлено через 4 минуты
Сообщение от ILNAR_93
в активити находТСЯ фрагмент и в него потом добавляюТСЯ другие?
При запуске приложения фрагмента нет. есть только контейнер для фрагментов

Добавлено через 12 минут
Паблито,

Сделал так: Если переход происходит по нажатию кнопки в дравер меню то очищаю стек
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void clearStack(){
        try {
            FragmentManager fragmentManager = getSupportFragmentManager();
            if (fragmentManager == null) return;
            int count = fragmentManager.getBackStackEntryCount();
            while (count > 0) {
                fragmentManager.popBackStack();
                count--;
            }
        } catch (NullPointerException ex){
            ex.printStackTrace();
        } catch (Exception ex){
            ex.printStackTrace();
        }
    }