簡體   English   中英

標簽內的片段

[英]Fragments inside tabs

我正在創建具有兩個選項卡的菜單。 每個選項卡都有顯示內容的三個片段。 我雖然很簡單,但是經過實驗和谷歌搜索后,看來我錯了。

我設法在第一個標簽上創建了片段。 但是,當我切換到其他選項卡並返回時,出現以下錯誤消息,並且應用程序崩潰:

07-11 16:49:57.829: E/AndroidRuntime(20009): FATAL EXCEPTION: main
07-11 16:49:57.829: E/AndroidRuntime(20009): android.view.InflateException: Binary XML file line #8: Error inflating class fragment
07-11 16:49:57.829: E/AndroidRuntime(20009):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at com.machinedata.ui.feedback.UsersFragment.onCreateView(UsersFragment.java:16)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:828)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1032)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at android.app.BackStackRecord.run(BackStackRecord.java:622)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1382)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at android.os.Handler.handleCallback(Handler.java:605)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at android.os.Handler.dispatchMessage(Handler.java:92)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at android.os.Looper.loop(Looper.java:137)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at android.app.ActivityThread.main(ActivityThread.java:4507)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at java.lang.reflect.Method.invokeNative(Native Method)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at java.lang.reflect.Method.invoke(Method.java:511)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at dalvik.system.NativeStart.main(Native Method)
07-11 16:49:57.829: E/AndroidRuntime(20009): Caused by: java.lang.IllegalArgumentException: Binary XML file line #8: Duplicate id 0x7f0b0013, tag null, or parent id 0xffffffff with another fragment for com.machinedata.ui.UserListFragment
07-11 16:49:57.829: E/AndroidRuntime(20009):    at android.app.Activity.onCreateView(Activity.java:4252)
07-11 16:49:57.829: E/AndroidRuntime(20009):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:673)

現在,我的選項卡本身就是片段,它們被動態地放置在屏幕上。 然后,這些片段會膨脹xml文件,其中靜態放置了片段。 經過一番谷歌搜索后,我發現將片段放置在片段中有些棘手。

getChildFragmentManager在API級別17中工作,但我想將API級別保持在14中。是否仍然可以創建這種菜單結構? 我是否需要為選項卡創建單獨的活動?

這是顯示選項卡的活動:

    public class FeedbackActivity extends Activity implements UserListFragment.OnItemClickedListener
{

    private ToplistsFragment toplist;
    private UsersFragment users;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        setContentView(R.layout.feedback_screen);

        //create tabs for dashboard and graphs
        ActionBar.Tab tab1 = actionBar.newTab().setText(R.string.feedbackUsers);
        ActionBar.Tab tab2 = actionBar.newTab().setText(R.string.feedbackToplist);
        toplist = new ToplistsFragment();
        users = new UsersFragment();
        tab2.setTabListener(new MyTabsListener(toplist));
        tab1.setTabListener(new MyTabsListener(users));
        actionBar.addTab(tab1);
        actionBar.addTab(tab2);


    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        // TODO Auto-generated method stub
        super.onCreateContextMenu(menu, v, menuInfo);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // TODO Auto-generated method stub
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
    {
        // TODO Auto-generated method stub
        Log.v("log","ID: " + item.getItemId() + " " + item.getTitle());
        switch (item.getItemId()) 
           {        
              case android.R.id.home: 
                  Intent intent = new Intent(this, ModeSelectActivity.class);
                  startActivity(intent);        
                 return true;    


              default:            
                 return super.onOptionsItemSelected(item);    
           }
    }


    @Override
    public void onUserItemClick(AdapterView<?> parent, View v, int position, long id, UserData user) 
    { 
        //wite your activity code here  

        Log.v("log", "name: " + user.getName());     
    }


    //tablistener
    class MyTabsListener implements ActionBar.TabListener 
    {
        public Fragment fragment;

        public MyTabsListener(Fragment fragment) 
        {
            this.fragment = fragment;
        }

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) 
        {

        }

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) 
        {
            ft.replace(R.id.feedback_fragcontainer, fragment);
        }

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) 
        {
            ft.remove(fragment);
        }

    }
}

其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" >

        <LinearLayout
        android:id="@+id/feedback_fragcontainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" />

</LinearLayout>

和制表符片段的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="horizontal" 
    android:baselineAligned="false">

    <fragment
        android:id="@+id/feedbackuserListFragment"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="match_parent"
        class="com.machinedata.ui.UserListFragment" >

    </fragment>

    <fragment
        android:id="@+id/feedbackSessionListFragment"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="match_parent"
        class="com.machinedata.ui.feedback.SessionListFragment" >
        <!-- Preview: layout=@layout/details -->
    </fragment>

    <fragment
        android:id="@+id/feedbackDetailsFragment"
        android:layout_width="match_parent"
        android:layout_weight="0.5"
        android:layout_height="match_parent"
        class="com.machinedata.ui.feedback.DetailsFragment" >
        <!-- Preview: layout=@layout/details -->
    </fragment>




</LinearLayout>

老實說,我不確定帶有重復ID的錯誤消息是什么意思,或者是什么原因導致的。 基本上,我正在尋找一種解決方案,以創建我描述的菜單結構或修復當前實現的方法。

支持包中也提供了嵌套的片段功能(在API級別17上實現)。 android.support.v4.app.Fragment而不是android.app.Fragment擴展您的片段。 並將您的父活動替換為android.support.v4.app.FragmentActivity

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM