【问题标题】:Problems adding fragments添加片段的问题
【发布时间】: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


【解决方案1】:

在您的详细信息片段 setOnTouchListener 中获取 view() 并返回 true。

我假设细节片段覆盖在列表片段的顶部,并且由于细节是空的并且不消耗任何触摸事件,它会传播到您的列表片段中。

希望对你有帮助!!!

【讨论】:

  • 非常感谢,它有效! :) 我不认为这是“正常”的事情,android 框架应该自动执行此操作……但 android 是 android,我们知道 xD。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
相关资源
最近更新 更多