【问题标题】:Calling SupportFragmentManager from PauseHandler implementation从 PauseHandler 实现调用 SupportFragmentManager
【发布时间】:2016-11-27 22:48:21
【问题描述】:

我正在尝试实现此处描述的 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
                }
            }
        }
    }
}

当然,还有用于扩展 Handler 的 PauseHandler 的代码和用于对话框的代码,但它们工作正常,因此似乎不相关。

编辑 添加了重新扫描对话框的代码,此对话框在我添加 PauseHandler 之前运行良好,但我需要添加对用户在扫描过程中离开应用程序的情况的支持,因此需要 PauseHandler

【问题讨论】:

  • 什么是rescanDialogBox?可以分享一下代码吗?
  • @jayeshsolanki93 我已经添加了 rescanDialogBox 的代码,谢谢你的任何想法。
  • 好的,rescanDialogBox 看起来不错。
  • 当你已经将它作为PauseHandlerImplementaion 类的成员字段时,为什么还要在processMessage 中创建一个新的activity 变量?您是否也尝试过使用 getActivity() 代替?
  • @jayeshsolanki93 我只是从我链接到的第一个答案中复制代码,它们似乎复制了活动变量。我不知道为什么。我尝试用 getActivity() 替换它,但随后错误变为Cannot resolve method getActivity()

标签: java android android-fragments android-support-library android-handler


【解决方案1】:

首先,ActionBarActivity现在已弃用。您可能应该使用AppCompatActivity 来支持以前的Android 版本。

其次,您应该使用.replace(int ontainerViewId, Fragment fragment) 方法指定放置State 片段的容器。您的方法应如下所示:

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

希望对你有帮助!

【讨论】:

【解决方案2】:

我遇到了和你一样的问题,我觉得你应该改一下

import android.support.v4.app.DialogFragment

到

import android.app.DialogFragment;

在您的DialogFragment 班级中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多