导航抽屉默认片段

22

我是新手开发者,正在使用android-support v7集成导航抽屉控件,有一个问题想请教。当我启动应用程序时,主要布局是这样的:

<?xml version="1.0" encoding="utf-8"?>

<!-- The main content view -->

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<!-- The navigation drawer -->

<ListView
    android:id="@+id/left_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="@android:color/white"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp" />

这是我的主要活动:

drawerList.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            Fragment fragment = null;

            switch (position) {
                case 0:
                    fragment = new Fragment1();
                    break;
                case 1:
                    fragment = new Fragment2();
                    break;
                case 2:
                    fragment = new Fragment3();
                    break;  
                case 3:
                    fragment = new Fragment4();
                    break;
            }

            FragmentManager fragmentManager = 
                    getSupportFragmentManager();

            fragmentManager.beginTransaction()
                    .replace(R.id.content_frame, fragment)
                    .commit();

            drawerList.setItemChecked(position, true);

            tituloSeccion = opcionesMenu[position];
            getSupportActionBar().setTitle(tituloSeccion);

            drawerLayout.closeDrawer(drawerList);
        }
    });

如何设置应用程序的默认片段,例如主布局?谢谢


你可以在下面的帖子中找到我的答案 启动时设置初始片段 - Hakem Zaied
7个回答

55
如果每次创建活动时加载默认片段没有问题,您可以将FragmentTransaction放在onCreate()中。
看起来像这样:
@Override
public void onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);
    FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
    tx.replace(R.id.content_frame, new Fragment1());
    tx.commit();


}
如果您想以更复杂的方式完成此操作(例如在返回主活动时切换到不同片段),可以使用带有附加项确定 onCreate() 中的片段的 Intent ,并在加载额外内容时将默认片段放入 defaultValue中:
int position = getIntent().getIntExtra("position", 1);
switch(position){

    ...

}

我花了5个小时来弄清楚这个问题,如果你已经掌握了技巧,那么这个问题就很简单。谢谢,这节省了我更多的时间和精力。 - user2029541
很高兴听到这个消息,@user2029541。 - super-qua
我的第一个片段在0位置,即使将另一个活动移动到主视图中,每次都会加载。如何解决? - Harsha
当用户改变手机的方向时,此解决方案将返回到默认片段,例如。您应该检查片段是否已经设置为@sorianiv答案中提到的内容,并且仅在片段为空时执行事务。 - Damien Plumettaz

18
将这段代码放在主活动的onCreate()方法的末尾。
 if (savedInstanceState == null) {
        selectItem(0);
 }

8
给我返回“无法解析方法selectItem(int)”错误信息。@Jemshit Iskenderov - Maulik Dodia

1

如果你的意思是在XML中完成,那是不可能的。你需要在activity的onCreate方法中完成。例如:

if (getFragmentManager().findFragmentById(R.id.content_frame) == null) {
  selectItem(0);
}

其中selectItem是您在抽屉中选择片段时使用的方法,就像谷歌的示例https://developer.android.com/training/implementing-navigation/nav-drawer.html中所示,0是默认片段的位置。


0
在onCreate中尝试这个:
Fragment fragment = null;
fragment = new HomeFragment();                                                              
//HomeFragment= fragment class to launch that
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.screen_area, fragment);
fragmentTransaction.commit();

0

它有帮助,它正在工作

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_page);

    FragmentManager fragmentManager= getFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.content_frame
                    ,new YourClass())
            .commit();
}

1
添加一些描述会更有帮助,仅有代码片段并不足够。 - Mathews Sunny

0

如果您正在使用Android Studio底部导航模板:

  1. 前往app/src/main/res/navigation/mobile_navigation.xml
  2. 将“app:startDestination”更改为您想要在加载时显示的片段。

希望这能帮助像我这样不太有经验的人使用该模板。


-6
在你的 switch 代码中添加一个默认情况。
    @Override 
       public void onItemClick(AdapterView<?> parent, View view,
              int position, long id) {

        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new Fragment1();
                break;
            case 1:
                fragment = new Fragment2();
                break;
            case 2:
                fragment = new Fragment3();
                break;  
            case 3:
                fragment = new Fragment4();
                break;
            default:
                fragment = new Fragment1();
                break;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接