【发布时间】:2014-03-28 08:08:10
【问题描述】:
我在基于 Xamarin 的 Android 应用程序中使用片段,但是当我 Add() 一个新片段时(即使我可以在屏幕上看到这个新片段),如果我触摸屏幕我可以看到老片段的监听器还在工作。
我有两个片段。 fragment1 是一个 listView,fragment2 显示了 fragment1 中存在的实体的详细信息。单击此 listView 的一项,屏幕上将添加一个新片段(fragment2)。但是即使我可以看到 fragment2,如果我点击屏幕,屏幕上也会添加第三个 Fragment,因为 Fragment1 的侦听器仍然处于活动状态。
我该如何解决这个问题?
如果我用来改变片段的函数:
private void ChangeFragment (TitledFragment newFragment, string fragmentTitle)
{
if (newFragment is IPrimaryFragment) {
_drawerToggle.DrawerIndicatorEnabled = true;
_drawer.SetDrawerLockMode (DrawerLayout.LockModeUnlocked);
_displayingPrimaryFragment = true;
SupportFragmentManager.BeginTransaction ().Replace (Resource.Id.content_frame, newFragment).Commit ();
if (_currentFragment != null)
_currentFragment.Cleanup ();
} else {
_drawerToggle.DrawerIndicatorEnabled = false;
_drawer.SetDrawerLockMode (DrawerLayout.LockModeLockedClosed);
_displayingPrimaryFragment = false;
SupportFragmentManager.BeginTransaction ().Add (Resource.Id.content_frame, newFragment).AddToBackStack (null).Commit ();
}
if (fragmentTitle != null)
newFragment.Title = fragmentTitle;
ActionBar.Title = newFragment.Title;
_currentFragment = newFragment;
}
public override bool OnKeyUp (Keycode keyCode, KeyEvent e)
{
if (keyCode == Keycode.Menu) {
if (_drawer.IsDrawerOpen (GravityCompat.Start))
_drawer.CloseDrawer (GravityCompat.Start);
else
_drawer.OpenDrawer (GravityCompat.Start);
return true;
}
if (keyCode == Keycode.Back) {
if (_displayingPrimaryFragment) {
DialogUtils.ShowDialog (this, GetString (Resource.String.do_you_really_want_to_exit), null, true, GetString (Resource.String.yes), GetString (Resource.String.no), () => base.Finish (), () => {} );
return true;
} else {
SupportFragmentManager.PopBackStackImmediate ();
_currentFragment = (TitledFragment) SupportFragmentManager.FindFragmentById (Resource.Id.content_frame);
if (_currentFragment is IPrimaryFragment) {
_displayingPrimaryFragment = true;
_drawerToggle.DrawerIndicatorEnabled = true;
_drawer.SetDrawerLockMode (DrawerLayout.LockModeUnlocked);
}
ActionBar.Title = _currentFragment.Title;
return true;
}
}
return base.OnKeyUp (keyCode, e);
}
现在 fragment2 只是一个空布局..这是 xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/pnlMain"
android:background="#ffffff" />
【问题讨论】:
-
+1 用于第一个问题的正确格式。
-
发生这种情况的唯一方法是,如果您将触摸侦听器设置在片段容器上,而不是片段本身中的某些内容上。
标签: android android-fragments xamarin.android