添加新片段后,先前的片段元素仍处于活动状态
Previous fragment element is still active after adding new fragment
这张图片可能会更好地描述我的问题。当我在第一个片段(第一个图像)上添加第二个片段(第二个图像)时,第一个片段元素(Spinner,EditText)仍然active.Active意味着触摸同一个地方我可以看到下拉菜单正在下降。
我无法替换该片段,因为我需要返回到用户离开第一个片段时的状态 fragment.Can 谁能告诉我这是什么问题。
我正在使用广播添加第二个片段,因为它需要从 baseAdapter 调用 listview.Code 就像这样。
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"));
您应该删除之前的片段。
尝试使用此代码:
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();
}
}
有一个简单的技巧。获取顶部片段的主容器/父视图并为其添加 onClickListener
。不要在 onClick 内部做任何事情。这样,您在顶部的片段将捕获用户点击。希望已经足够清楚了。
示例 - 如果您的片段布局有一个 Linearlayout
作为父级,请在您的片段代码中为它分配一个 onClickListener
,就像您为按钮所做的那样。
这张图片可能会更好地描述我的问题。当我在第一个片段(第一个图像)上添加第二个片段(第二个图像)时,第一个片段元素(Spinner,EditText)仍然active.Active意味着触摸同一个地方我可以看到下拉菜单正在下降。
我无法替换该片段,因为我需要返回到用户离开第一个片段时的状态 fragment.Can 谁能告诉我这是什么问题。
我正在使用广播添加第二个片段,因为它需要从 baseAdapter 调用 listview.Code 就像这样。
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"));
您应该删除之前的片段。
尝试使用此代码:
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();
}
}
有一个简单的技巧。获取顶部片段的主容器/父视图并为其添加 onClickListener
。不要在 onClick 内部做任何事情。这样,您在顶部的片段将捕获用户点击。希望已经足够清楚了。
示例 - 如果您的片段布局有一个 Linearlayout
作为父级,请在您的片段代码中为它分配一个 onClickListener
,就像您为按钮所做的那样。