如何同时只有2个活动的3窗格显示(例如Gmail)

时间:2011-04-26 08:46:36

标签: android android-3.0-honeycomb android-fragments

我正在编写一个看起来像gmail的应用程序。事实上,我想在屏幕上激活2个窗格,就像在Honeycomb gmail应用程序中一样。

我的主要布局是:

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

    <fragment android:name="org.bicou.newsreader.SubscriptionsList"
        android:id="@+id/fragment_left_list"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent" />

    <FrameLayout android:id="@+id/fragment_middle_content" android:layout_weight="3"
        android:layout_width="0px" android:layout_height="match_parent"
        android:background="?android:attr/detailsElementBackground" />

    <FrameLayout android:id="@+id/fragment_right_content" android:layout_weight="8"
        android:visibility="gone"
        android:layout_width="0px" android:layout_height="match_parent"
        android:background="?android:attr/detailsElementBackground" />

</LinearLayout>

SubscriptionsList片段在加载时会使用另一个片段填充fragment_middle_content framelayout。

当我在第二个片段中执行某些操作时,我想:

  • 隐藏fragment_left_list
  • fragment_middle_content放在左侧
  • 使用第3个片段显示fragment_right_content

但是,我不知道该怎么做。与上面的XML布局一样,您可以看到隐藏了第3帧布局(visibility == gone)。因此,当我在第二个片段中执行某些操作时,我有:

        FragmentManager fm = getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();

        // Hide the left pane
        SubscriptionsList sl = (SubscriptionsList) fm.findFragmentById(R.id.fragment_left_list);
        ft.hide(sl);

        // Show the right pane
        OneItem oi = OneItem.newInstance(mEntries.get(position));
        ft.replace(R.id.fragment_right_content, oi);
        ft.show(oi);
        getActivity().findViewById(R.id.fragment_right_content).setVisibility(View.VISIBLE);

        ft.addToBackStack(null);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.commit();

这个工作一次。当我向后推时,后面的堆栈会恢复片段事务,但不会隐藏第三个片段。

我知道我没有正确的方法,但我还不熟悉3.0编程API。

2 个答案:

答案 0 :(得分:1)

我找到了有用的东西:

  • 我在XML中实际上将第3个片段设为<fragment>
  • 当应用启动时,我添加一个隐藏它的交易
  • 当我点击某个项目时,我会显示它&amp;用我想要显示的内容替换它

结果有点迟钝,但我认为这是因为它在显示转换时初始化内容中的webview。我会找到一种方法让这个顺利。

答案 1 :(得分:0)

我是通过覆盖主要活动的后退按钮来完成的。我在主布局xml文件中使用了2个FrameLayouts后面的1个片段。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK)) {
        View partlarFrame = findViewById(R.id.partview_fragment);
        if(partlarFrame != null && partlarFrame.getVisibility() == View.VISIBLE)
        {
            partlarFrame.setVisibility(View.GONE);
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
            ft.show(getSupportFragmentManager().findFragmentById(R.id.tutlist_fragment));
            ft.remove(getSupportFragmentManager().findFragmentById(R.id.partview_fragment));
        ft.commit();
        return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}