【问题标题】:Android fragment can be clicked when hidden (Maps v2 + Sliding Drawer issue)隐藏时可以单击 Android 片段(地图 v2 + 滑动抽屉问题)
【发布时间】:2015-10-13 21:37:10
【问题描述】:

这里有一些有趣的问题,我希望有人能解释一下。

我目前在同一屏幕上有一个带有滑动抽屉(已弃用 - 我知道)的 Maps v2 片段。一旦用户完成了他们的任务,他们可以拉动滑动绘图并单击“完成”。这利用了 SupportFragmentManager,我基本上最终用一个全新的片段替换了屏幕的内容。

但是,即使滑动抽屉已被新片段替换,用户仍然可以单击滑动抽屉上的内容。有什么提示吗?

下面是负责代码的骨架结构:

activity_map.xml

<RelativeLayout android:id="@+id/activity_map">

    <LinearLayout>
        <include layout="@layout/toolbar"/>

        <fragment android:id="@+id/fragment_map"
            android:name="com.foo.fragment.MapFragment" />
    </LinearLayout>

    <SlidingDrawer>
        ...
    </SlidingDrawer>

</RelativeLayout>

MapActivity.java

...
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.activity_map, newFragment, TAG);
transaction.addToBackStack(null);
transaction.commit();

【问题讨论】:

  • transaction.replace(R.id.activity_map, newFragment, TAG); 您正在尝试替换布局容器(RelativeLayout)上的片段,而没有任何片段!
  • 您应该将activity_map.xml 的布局内容作为片段布局的一部分,然后您将能够实现所需的行为。
  • @MuhammadBabar 但我在上面的容器中有一个地图片段。我需要一个围绕滑动抽屉和我的地图片段的活动,然后我需要替换抽屉和地图并用另一个片段填充屏幕。做这个的最好方式是什么? ——
  • 如果这适合您的架构,当前最简单的方法是打开一个新活动!否则,您必须遵循上述建议!
  • @MuhammadBabar 好的,对于我需要做的事情来说,开始一个新的活动完全是矫枉过正,所以请您在下面的答案中发布修改后的 activity_map.xml 吗?我会执行你的第一个建议。谢谢!

标签: android google-maps android-fragments slidingdrawer


【解决方案1】:

你应该尝试这样做 activity_map.xml

<FrameLayout
android:id="@+id/container>

</FrameLayout>

fragment_map.xml

<RelativeLayout android:id="@+id/activity_map">

    <LinearLayout>
        <include layout="@layout/toolbar"/>

        <fragment android:id="@+id/fragment_map"
            android:name="com.foo.fragment.MapFragment" />
    </LinearLayout>

    <SlidingDrawer>
        ...
    </SlidingDrawer>

</RelativeLayout>

现在,在您的活动中,您应该首先在 FrameLayout (activity_map.xml) 中启动一个具有 fragment_map 布局的新片段(比如说 AMapFragment)。请注意现在下面的代码将成为您的片段(AMapFragment)的一部分

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.activity_map, newFragment, TAG);
transaction.addToBackStack(null);
transaction.commit();

并将这一行 transaction.replace(R.id.activity_map, newFragment, TAG); 更改为 transaction.replace(R.id.container, newFragment, TAG);

【讨论】:

  • 好的,谢谢。在父片段中嵌入片段(Google Map V2 + 滑动抽屉)是否会遇到问题?
  • 不,你不应该这样做,因为没有嵌套片段
  • 好的,今晚会测试一下。对于像这种标准实践这样的情况是嵌套的片段,还是我应该打开一个新活动并将其初始化为我之前活动+片段中的所有变量。我想从头开始正确设计。我很乐意实施这两种解决方案。
  • 嵌套片段如果适合您的应用程序和设计架构,则可以使用!请注意,对于嵌套片段,您必须使用 getChildfragmentManager 而不是 getFragmentManager!
【解决方案2】:

在这种情况下,最简单、最优雅的解决方案是在我的静态 xml 布局文件中的新片段上设置 clickable="true"。

下一步是手动将侦听器与此片段上的新按钮和文本编辑相关联。

像魅力一样工作!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2015-10-10
    • 1970-01-01
    相关资源
    最近更新 更多