「已注销」 2016-09-26 06:26 采纳率: 0%
浏览 1939

Fragment调用另一个Fragment replace hide 方法无效??求解决。。

selectorListFragment = new SelectorListFragment();
wiredNetWorkFragment = new WiredNetWorkFragment();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        FragmentManager fragmentManager = getActivity().getFragmentManager();


        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            FragmentTransaction ft_info_list = fragmentManager.beginTransaction();
            ft_info_list.replace(R.id.network_set_content, wifiInfoFragment);
            ft_info_list.addToBackStack(null);
            ft_info_list.commit();

            FragmentTransaction fragmentTransaction_right = fragmentManager.beginTransaction();
            fragmentTransaction_right.hide(WifiListFragment.this).commit();

            FragmentTransaction ft_select_list = fragmentManager.beginTransaction();
            ft_select_list.hide(selectorListFragment);
            ft_select_list.commit();

        }
    });

这里的selectorListFragment并没有被隐藏。。。

  • 写回答

1条回答

  • wangclhuangmt 2016-09-26 06:55
    关注

    从Activity_A打开Activity_B并展示Fragment,此时切换到设置->语言,修改系统语言,之后再次从Launcher启动Activity_A并进入次级Activity_B,控制fragment隐藏/显示按钮失效。

    分析后返现,切换语言后,Activity_B执行了onDestroy和onCreate方法,所以Activity_B中的Fragment对象已经是新的了,因此无法控制原Fragment的显示于隐藏,而直接注释掉super.onSaveInstanceState()方法会导致无法保存Activity_B的状态。这里贴一下我的解决方案:
    protected void onSaveInstanceState(Bundle outState) {
    if (mDialpadFragment != null) {
    getFragmentManager().putFragment(outState,"MyFragment",mDialpadFragment);
    }
    super.onSaveInstanceState(outState);
    }
    在onSaveinstanceState中保存之前的Fragment对象。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_bug);
    if (savedInstanceState != null) {
    mDialpadFragment = (DialpadFragment)getFragmentManager().getFragment(savedInstanceState,"MyFragment");
    }
    在重新创建的时候判断Bundle如果不为空,则取出之前保存的Fragment。这里因为FragmentManger().getFragment()返回值是Fragment对象,因此需要向下转型为自己的Fragment对象。

    缺点:

    虽然能够正常使用该对象控制Fragment的显示和隐藏,但如果此时调用mDialpadFragment.isVisible()却会返回false,查看源码后发现isVisible的代码如下:

    final public boolean isVisible() {
    return isAdded() && !isHidden() && mView != null
    && mView.getWindowToken() != null && mView.getVisibility() == View.VISIBLE;
    }
    导致isVisible()返回false的主要原因是mView.getWindowToken() == null,这是因为Activity已经重新创建了,之前通过onSaveInstanceState方法保存的WindowToken已经找不到对应的Window,因此getWindowToken()为null。

    解决方案:

    在DialpadFragment中自定义一个isVisible(Context context):

    public boolean isVisible(Context context) {
        return isAdded() && !isHidden() && getView() != null
                && getView().getVisibility() == View.VISIBLE;
    }
    

    不去判断windowToken的值。同时最好在onResume之后再使用mDialpadFragment.isVisible(context)来判断Fragment是否可见。

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)