Вызов SupportFragmentManager из реализации PauseHandler

Я пытаюсь реализовать описанный здесь PauseHandler:

https://stackoverflow.com/a/8122789/1977132

Моя активность - это ActionBarActivity, код в методе processMessage, который вызывает диалог, дает ошибку Cannot resolve method 'getSupportFragmentManager'

Следуя предложению здесь: https://stackoverflow.com/a/27425568/1977132

Я пытался изменить его на getFragmentManager(), но потом получаю ошибку Cannot resolve method 'show(android.app.FragmentManager(), java.lang.String'

Я вставил сюда то, что считаю соответствующим кодом:

import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBarActivity;

public class PlaySession extends ActionBarActivity implements View.OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null) {
            final Fragment state = new State();
            final FragmentManager fm = getSupportFragmentManager();
            final FragmentTransaction ft = fm.beginTransaction();
            ft.add(state, State.TAG);
            ft.commit();
        }
    }

    public static class rescanDialogBox extends DialogFragment {
        final static String TAG = "RESCAN";

        public static rescanDialogBox newInstance(int title) {
            rescanDialogBox frag = new rescanDialogBox();
            Bundle args = new Bundle();
            args.putInt("title", title);
            frag.setArguments(args);
            return frag;
        }

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            String title = "Rescan?";
            String message = "No Bluetooth LE devices found. Do you want to rescan? If you keep getting this message check the battery of your Bluetooth device.";

            AlertDialog.Builder myDialogBuilder = new AlertDialog.Builder(getActivity());
            myDialogBuilder.setTitle(title);
            myDialogBuilder.setMessage(message);
            myDialogBuilder.setPositiveButton("YES",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        ((PlaySession) getActivity()).yesRescan();
                    }
                });
            myDialogBuilder.setNegativeButton("NO",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        ((PlaySession) getActivity()).noRescan();
                    }
                });

            AlertDialog myDialog = myDialogBuilder.create();
            myDialog.setCanceledOnTouchOutside(false);

            return myDialog;
        }
    }

    public void yesRescan() {
        //rescan
    }

    public void noRescan() {
        //do nothing
    }

    final static class State extends Fragment {
        static final String TAG = "State";
        public PauseHandlerImplementation handler = new PauseHandlerImplementation();

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setRetainInstance(true);
        }

        @Override
        public void onResume() {
            super.onResume();
            handler.setActivity(getActivity());
            handler.resume();
        }

        @Override
        public void onPause() {
            super.onPause();
            handler.pause();
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            handler.setActivity(null);
        }
    }


    static class PauseHandlerImplementation extends PauseHandler {
        protected Activity activity;

        final void setActivity(Activity activity) {
            this.activity = activity;
        }

        @Override
        final protected void processMessage(String toDo) {
            final Activity activity = this.activity;

            if (activity != null) {
                if(toDo.equals("OFFER_RESCAN")) {
                    //offer rescan
                    DialogFragment newFragment = new rescanDialogBox();
                    newFragment.show(activity.getSupportFragmentManager(), rescanDialogBox.TAG);
                    activity.getSupportFragmentManager().executePendingTransactions();

                } else if (toDo.equals("OFFER_DEVICES")) {
                    //offer devices
                }
            }
        }
    }
}

Конечно, есть также код для PauseHandler, который расширяет Handler и код для диалогового окна, но он работал/работает нормально, поэтому не кажется актуальным.

EDIT Добавлен код для диалогового окна повторного сканирования, это диалоговое окно работало нормально до того, как я добавил PauseHandler, но мне нужно было добавить поддержку случая, когда пользователь уходит из приложения во время сканирования, следовательно, потребность в PauseHandler


person user1977132    schedule 24.07.2016    source источник
comment
что такое рескандиалогбокс? Не могли бы вы поделиться кодом для него?   -  person jayeshsolanki93    schedule 24.07.2016
comment
@jayeshsolanki93 jayeshsolanki93 Я добавил код для rescanDialogBox, спасибо за любые ваши идеи.   -  person user1977132    schedule 26.07.2016
comment
Хорошо, rescanDialogBox выглядит нормально.   -  person jayeshsolanki93    schedule 26.07.2016
comment
Почему вы создаете новую переменную activity внутри processMessage, если она уже есть в качестве поля-члена класса PauseHandlerImplementaion? Также вы пытались вместо этого использовать getActivity()?   -  person jayeshsolanki93    schedule 26.07.2016
comment
@jayeshsolanki93 jayeshsolanki93 Я просто копировал код из первого ответа, на который я ссылался, они, похоже, дублируют переменную активности. Я не знаю почему. Я пытался заменить его на getActivity(), но тогда ошибка меняется на Cannot resolve method getActivity()   -  person user1977132    schedule 26.07.2016


Ответы (2)


Во-первых, ActionBarActivity больше не рекомендуется. Вероятно, вам следует использовать AppCompatActivity, чтобы иметь возможность поддерживать предыдущую версию Android.

Во-вторых, вы должны указать контейнер, в который нужно поместить фрагмент состояния, с помощью метода .replace(int ontainerViewId, Fragment fragment). Ваш метод должен выглядеть так:

final Fragment state = new State();
final FragmentManager fm = getSupportFragmentManager();
final FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.your_container_id, state);
ft.commit();

Надеюсь, поможет!

person José Messias Jr    schedule 24.07.2016
comment
Сам фрагмент State не имеет пользовательского интерфейса, поэтому он не добавляется в контейнер (onCreateView возвращает null — см. developer.android.com/reference/android/app/ ). Спасибо за предложение. - person user1977132; 26.07.2016

У меня была такая же проблема, как у вас, я думаю, вы должны изменить

import android.support.v4.app.DialogFragment

to

import android.app.DialogFragment;

в вашем DialogFragment классе

person alaa    schedule 25.09.2016