【问题标题】:Previous fragment element is still active after adding new fragment添加新片段后,前一个片段元素仍然处于活动状态
【发布时间】:2015-02-17 18:20:56
【问题描述】:

这张图片可能会更好地描述我的问题。当我在第一个片段(第一个图像)上添加第二个片段(第二个图像)时,第一个片段元素(Spinner,EditText)仍然处于活动状态。活动意味着触摸同一个地方我可以看到下拉菜单正在下降。

我无法替换片段,因为我需要回到用户离开第一个片段的相同状态。谁能告诉我问题出在哪里。

我正在使用广播添加第二个片段,因为它需要从 baseAdapter listview 调用。代码是这样的。

ListView onclick

view.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) 
        {
            Log.v("TAG", "Clicked: " + itemListPogo.get(position).getitemIdplato());

            Intent i = new Intent("start.fragment.action");
            i.putExtra("plateId", itemListPogo.get(position).getitemIdplato());
            mContext.sendBroadcast(i);
        }
    });

复活

    mBroadcastReceiver = new BroadcastReceiver() 
    {
        @Override
        public void onReceive(Context context, Intent intent) 
        {
            Bundle extra = intent.getExtras();
            String plateId = extra.getString("plateId");  

            Fragment fragment = new PlateDetailsFragment(DashBoardActivity.this, Integer.parseInt(plateId));
            FragmentManager fragmentManager = (DashBoardActivity.this).getFragmentManager();
            fragmentManager.popBackStack("back", FragmentManager.POP_BACK_STACK_INCLUSIVE);

            fragmentManager.beginTransaction().add(R.id.frame_container, fragment).addToBackStack(plateId).commit();
        }
    };
    this.registerReceiver(mBroadcastReceiver, new IntentFilter("start.fragment.action"));

【问题讨论】:

  • “我无法替换片段,因为我需要回到用户离开第一个片段的相同状态”——您似乎正在通过popBackStack() 删除旧片段,所以我不明白这个评论。 “我正在使用广播添加第二个片段,因为它需要从 baseAdapter 列表视图中调用”——不要为此使用系统广播。使用进程内事件总线(LocalBroadcastManager、greenrobot 的 EventBus、Square 的 Otto 等)。就目前而言,任何人都可以破解您的应用程序。

标签: android android-fragments android-listfragment


【解决方案1】:

有一个简单的技巧。获取顶部片段的主容器/父视图并为其添加onClickListener。不要在 onClick 内部做任何事情。这样,您顶部的片段将捕获用户点击。希望它足够清楚。

示例 - 如果您的片段布局有一个 Linearlayout 作为父级,请在片段代码中为其分配一个 onClickListener,就像您为按钮所做的那样。

【讨论】:

  • 是的,你是对的。你能告诉我为什么会发生它是一个错误。
  • 我不认为这是一个错误,片段只为那些具有 onClickListener 的元素注册点击。否则,点击将发送到片段后面的元素。我认为原因是一个fragment只返回一个视图,而不是一个完全独立的屏幕。
  • 如何在 ViewPager 中应用相同的内容?请帮帮我。
【解决方案2】:

你应该删除之前的片段。

尝试使用此代码:

public static void insertFragment(Context context, int resId, Class<? extends Fragment> clazz, Bundle args, boolean stack)
    {
        if (context != null)
        {
            FragmentManager manager = ((FragmentActivity) context).getSupportFragmentManager();
            FragmentTransaction tx = manager.beginTransaction();

            if (stack)
            {
                tx.addToBackStack(null);
            }
            else
            {
                Fragment fragment = manager.findFragmentById(resId);
                if (fragment != null)
                    tx.remove(fragment);
            }
            tx.add(resId, Fragment.instantiate(context, clazz.getName(), args));
            tx.commitAllowingStateLoss();
        }
    }

【讨论】:

  • 但是我需要前一个片段处于相同状态,我的意思是有一个下拉列表,您可以根据该下拉列表看到它会准备列表。所以如果我要删除前一个片段回来的时间我无法恢复该列表的相同状态。
猜你喜欢
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多