3

在 Android 3.0 及更高版本上,android 团队正在努力推动您应该使用片段而不是活动。我认为这很有用,但我希望能够在我的应用程序中处理点击事件。我在我的应用程序的右侧使用了一个列表片段,因此在承载该片段的活动中发生了 onclick(或任何点击侦听器)。因此,我不得不从将项目放入 XML 转向使用片段管理器。

在设计文件中,他们展示了这张图片:误导性照片

http://developer.android.com/training/basics/fragments/fragment-ui.html

我想要的是 Fragment A/B 平板电脑 UI。但是,此页面中没有任何地方实际上为您提供了这样做的示例 - 片段管理器似乎一次只能处理一个片段 - 这与图片所描绘的完全相反。这让我觉得它在 XML 中使用......但是我将如何获得 onclick?这些文件对我来说没有多大意义。它显示一件事,然后说另一件事。如果我想删除平板电脑上的 Fragment A 怎么办?添加尚不存在的片段 C?如果您尝试使用片段管理器,这甚至可能吗????

如果片段管理器使用超过 1 个片段,我想我不明白,如果是这样,我应该如何使用它来获取图片中的项目,如平板电脑 - 左侧 (A) 是列表视图,而对(B)是什么。如果没有片段的 ID,我将无法访问它。

不确定这是否相关,但这是我的一些代码:

将片段添加到我在指南中制作的单个框架布局中

//Activity              
FragLaunch launchPane = new FragLaunch();
                // In case this activity was started with special instructions from an Intent,
                // pass the Intent's extras to the fragment as arguments
                // firstFragment.setArguments(getIntent().getExtras());

                // Add the fragment to the 'fragment_container' FrameLayout
                getFragmentManager().beginTransaction()
                        .add(R.id.launch_frag_container, launchPane).commit();
            }

此外,在 7" 平板电脑的纵向模式下,我希望它使用可滑动的查看器。当我用 XML 设计它时,它就像一个魅力,但现在我必须访问它不起作用的列表片段(没办法访问,因为我不能有两个片段)

FragLaunch 的内容视图的 XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:gravity="center_vertical"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/initial_directions"
        style="@style/textScalar.Roboto.Light"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="@string/initial_directions"
        android:layout_marginBottom="30dp"
        tools:context=".Launch" />

</LinearLayout>

我想让这个在照片中显示为片段 A:片段的 FragHistory.java/xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/spamhistory"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Spam History" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:drawSelectorOnTop="false" />

</LinearLayout>

有人对此有任何见解吗?

4

2 回答 2

1

如果您希望您的片段能够进行通信,那么您需要使用接口,就像这样

对于 onClick 事件,您只需为需要接收 onClick 事件的视图设置一个 onClickListener。像这样:

sampleView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        //Your code here
    }
});

至于片段事务,它在那里的某个地方(我不记得确切的位置)说,当两个片段同时显示在屏幕上时(与更大的屏幕一样),它不会交换片段,而是简单地更新它。您所需要担心的只是做出正确的调用。因此,如果您想删除片段 A,只需调用 remove()。或者,如果您想用片段 C 替换它,请调用 replace() 并将片段 C 作为参数传入。

你能澄清你关于 ViewPager 的问题吗?你是什​​么意思“必须访问它”?

希望这可以帮助!

编辑:我道歉,我误解了你的问题。下面是关于如何一次向屏幕添加多个片段的快速介绍。

1.执行运行时检查以确保设备屏幕足够大以显示多个片段。

2.如果屏幕足够大,请将内容视图设置为使用一个布局,该布局对您要添加的每个片段都有一个 FrameLayout。

3.之后获取对您要使用的每个片段的引用。

4.然后使用 FragmentManager 为每个布局添加一个片段。像这样:

FirstExampleFragment fragment1 = new FirstExampleFragment();
SecondExampleFragment fragment2 = new SecondExampleFragment();

getSupportFragmentManager().beginTransaction().add(R.id.example_framelayout1, fragment1)
.add(R.id.example_framelayout2, fragment2).commit();
于 2013-01-23T07:51:24.880 回答
1

另一个允许片段之间通信的好方法是使用事件总线,例如Otto事件总线。Otto 允许组件以解耦的方式发布事件和订阅事件。

在您的特定情况下,当用户选择列表中的项目时,您的列表片段可以发布一个事件(其中可以包括已选择的项目)并且您的内容片段可以订阅这些事件并在收到时相应地更新其内容一个新的事件。这一切都是在两个片段没有直接耦合的情况下完成的,也不需要定义额外的接口。

我知道这并不能回答您的整个问题,但认为它可能对您的片段之间的通信有用....YMMV。

于 2013-04-26T07:15:46.797 回答