片段有用地替换片段和导航片段

时间:2011-07-25 22:51:33

标签: android android-fragments

所以我有这个ClientListView工作得很好,显示客户端,我可以点击客户端并在右边获取他们的详细信息(在我的第二个片段中)。这个布局定义如下:

<?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 class="com.viciousbytes.studiotab.subactivities.ClientListView"
        android:id="@+id/client_list" android:layout_weight="1"
        android:layout_width="0px" android:layout_height="match_parent" />

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

这很好用,但后来我意识到我有另一个活动(那是一个显示片段的片段活动)占据了整个屏幕,并且可以更好地分成两部分。

所以我开始更改一些最初显示此片段活动的代码

void showSessionEdit()
{
 ...

 Intent intent = new Intent(getActivity(), EditSessionActivity.class);
            //  Send the recipe index to the new activity
            intent.putExtra(EditSessionActivity.THE_SELECTED_CLIENT, (int)mClient.getID());
            intent.putExtra(EditSessionActivity.SELECTED_SESSION, sessionId);
            startActivityForResult(intent, 1899); 
 ....
}

这很好用,通过我的会话编辑器,我点击回来我回到我的客户和细节。虽然我意识到我希望我的会话编辑器更像我的客户列表/细节,它们都在同一个屏幕上。通过大量的错误试验,我终于用这个替换了上面的内容:

void showSessionEdit()
{
 ...
    SessionEdit details = (SessionEdit) getFragmentManager().findFragmentById(R.id.session_edit);               
                // Make new fragment instance to show the recipe
                details = SessionEdit.newInstance(mContext, mIsTablet, (int)mClient.getID(), sessionId);
                // Replace the old fragment with the new one
                FragmentTransaction ft = getFragmentManager().beginTransaction();                   
                ft.replace(R.id.client_list, details);
                ft.addToBackStack("client_list");
                // Use a fade animation. This makes it clear that this is not a new "layer"
                // above the current, but a replacement
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);                            

      ft.commit();
              ...
              //now add another fragment to the right, just to test i dont have my invoice fragment done yet so I just added session again to see if it would display it does.

SessionEdit details2 = (SessionEdit) getFragmentManager().findFragmentById(R.id.session_edit);              

                // Make new fragment instance to show the recipe
                details2 = SessionEdit.newInstance(mContext, mIsTablet, (int)mClient.getID(), sessionId);
                // Replace the old fragment with the new one
                FragmentTransaction ft2 = getFragmentManager().beginTransaction();
                ft2.replace(R.id.client_details, details2);
                ft.addToBackStack("client_details");
                // Use a fade animation. This makes it clear that this is not a new "layer"
                // above the current, but a replacement
                ft2.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);                           

      ft2.commit();
 ...
}

这很好用,虽然我意识到我不是替换"div"所以说布局而是片段本身,所以我对findFragmentById的引用不再是client_details键入或client_list类型,但现在为SessionEdit类型。因此,经过更多的试验和错误,我学会了将标签添加到addToBackStack(tag),我现在可以找到fragmentByTag,这很好用,后退按钮sorta工作:点击返回会再次替换我左边的client_list所以我可以点击客户端并且在右边获取他们的详细信息,问题是,如果我的client_list再次返回,右侧的详细信息仍将显示我的会话片段。另一个问题是我的客户列表是ListFragment,所以当我进行替换时,我仍然可以在新片段下面看到列表,就像它是赛璐珞一样。很奇怪。

所以我在用新的片段替换原始片段方面取得了一些进展,但是使用后退按钮导航不再像开箱即用那样工作,就像我刚刚做两个片段时一样,并在每个片段上添加新活动其他。那么如何围绕多个片段进行导航呢?理想情况下,我会有一个SessionInvoiceActivity,它会立即替换两个片段(左边的客户端列表,右边的客户端详细信息),左边是会话,右边是发票。当点击后退按钮时,id会返回我的客户列表和客户端详细信息?但是我不知道该怎么做,仍然传递我需要的信息。我还不清楚为什么当我更换片段时,原始片段可以在下面看到?它是xml布局定义问题吗?

1 个答案:

答案 0 :(得分:1)

我不确定你现在是不是已经弄清楚了,似乎我是一个夏天。

我发现在布局中指定的片段(在XML中)和使用FragmentManager添加的片段很难混合。

我有一个类似的问题是我在onCreate()中添加了我的“Master”片段,然后当通过大小或用户选择认为必要时,第二个片段将“Details”片段放在“Master”片段所在的位置或者如果处于横向模式,则添加到第二个布局。当用户点击后退键时,它将显示一个没有“主”片段的空白屏幕。我想我可能已经通过制作原始调用在Activity的onStart()中显示我的“Master”片段来解决这个问题。然而,这似乎还有一个问题。从onStart()添加“Master”片段时,请勿将事务添加到BackStack。这样就可以调用onResume()或来自之前Activity的任何内容,从而不会留下具有空白屏幕的Activity。