使用导航抽屉

时间:2015-10-16 09:44:43

标签: java android xml fragment

我很困惑如何通过单击导航抽屉中的一个项目来打开我的不同片段。

在MainActivity中,我使用以下代码:



@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    Fragment fragment;

    int id = item.getItemId();

    if (id == R.id.nav_listview) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.fragment, new ListFragment());
        ft.commit();

    } else if (id == R.id.nav_add_data) {

    } else if (id == R.id.nav_settings) {

    } else if (id == R.id.nav_legal_information) {

    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}




首先,我想尝试打开我的ListFragment:



import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


public class ListFragment extends Fragment {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        return inflater.inflate(R.layout.fragment_list, container, false);
    }
}




在我的内容main.xml中,我创建了以下片段,单击导航抽屉中的特定项目时应该替换该片段。



    <fragment
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/fragment" />
&#13;
&#13;
&#13;

但它不起作用......

任何人都可以帮助我吗?

Rastaman

6 个答案:

答案 0 :(得分:2)

为了得到你想要的东西试试这个,我也被这个有点复杂的代码所困扰,但它更容易使用

以下是详细说明并逐步解决此问题: (它似乎很长但你可以很容易地将你的工作联系起来)

首次创建导航抽屉活动时,我们会看到5个文件:

  • MainActivity.java - 这是我们应用中所有内容的代码。
  • activity_main.xml - 这是应用的布局,包括导航抽屉和app_bar_main的包含。
  • app_bar_main.xml - 这是包含工具栏的布局(位于顶部),浮动操作按钮(位于右下角),以及包含content_main。
  • content_main.xml - 这是主页内容的布局。
  • nav_header_main.xml - 这是导航抽屉顶部的用户界面。

第1步:  打开 app_bar_main.xml ,注释掉包含并添加新的FrameLayout:

<!--<include layout="@layout/content_main" />-->

<FrameLayout
  android:id="@+id/Fragment_container"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_marginTop="?attr/actionBarSize"/>

这个FrameLayout就是我们用来加载片段的东西。

第2步: 接下来,您将要添加一些片段 为此,请右键单击您的项目,或转到文件 - &gt;新建和从片段列表中选择片段(空白)或其他

第3步: 下一步是在应用程序首次启动时加载片段。转到 MainActivity 的onCreate方法,并在调用 setSupportActionBar 之后输入以下内容:

Fragment fragment = null;
Class fragmentClass = null;
fragmentClass = FragmentOne.class;
try {
    fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
    e.printStackTrace();
}

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.Fragment_container, fragment).commit();

第4步:

然后,您需要将 OnFragmentInteractionListener 添加到 MainActivity 实现的接口,并实现 onFragmentInteraction 方法。就像这样

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener, FragmentOne.OnFragmentInteractionListener ,FragmentTwo.OnFragmentInteractionListener,FragmentThree.OnFragmentInteractionListener {

第5步: 最后,在 onNavigationItemSelected 方法中,您可以添加在点击菜单项时加载不同片段的功能:

public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();
    Fragment fragment = null;
    Class fragmentClass = null;
    if (id == R.id.nav_camera) {
        fragmentClass = FragmentOne.class;
    } else if (id == R.id.nav_gallery) {
        fragmentClass = FragmentTwo.class;
    } else if (id == R.id.nav_slideshow) {
        fragmentClass = FragmentThree.class;
    } else if (id == R.id.nav_manage) {

    } else if (id == R.id.nav_share) {

    } else if (id == R.id.nav_send) {

    }
    try {
        fragment = (Fragment) fragmentClass.newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

这里我只是加载我添加到我的应用程序中的两个片段之一。请注意,因为我有两个不同的片段,所以我必须为FragmentOne.OnFragmentInteractionListener和FragmentTwo.OnFragmentInteractionListener实现接口。

您只需在导航抽屉中实现片段加载即可。 用户点击菜单项时,抽屉将平滑地滑回,新片段已经开始/完成加载。这也可以防止您在启动新活动时看到任何可能的混乱。

<强> EXTRA  最后要注意的是,如果切换到另一个片段,然后旋转设备或导致另一个活动重新创建,上面的代码将导致重新加载第一个片段。处理这个问题的一个简单方法是将onCreate方法中的片段块包装在一个检查中,以查看 savedInstanceState 是否为空,如下所示:

protected void onCreate(Bundle savedInstanceState) {
    ...
    if (savedInstanceState == null) {
        //Fragment load code
    }
    ...
}

答案 1 :(得分:1)

试用此代码

&#13;
&#13;
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    Fragment fragment=null;
 FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    int id = item.getItemId();

    if (id == R.id.nav_listview) {
       
       fragment= new ListFragment();
    

    } else if (id == R.id.nav_add_data) {

    } else if (id == R.id.nav_settings) {

    } else if (id == R.id.nav_legal_information) {

    }
ft.replace(R.id.container, fragment);
    ft.addToBackStack(null);
    ft.commit();
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}
&#13;
&#13;
&#13;

&#13;
&#13;
    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/container" />
&#13;
&#13;
&#13;

答案 2 :(得分:0)

是的,我找到了答案。但我很困惑。 如果我使用:

&#13;
&#13;
             if (id == R.id.nav_listview) {
                 fragment= new com.thomas.testapp.ListFragment();
&#13;
&#13;
&#13;

有效。但是如果我想打开ListFragment,我只需要使用包名。为什么呢?

答案 3 :(得分:0)

请更改您的片段类ListFragment的名称因为ListFragment已经是 android.app Android OS中的片段的子类

答案 4 :(得分:0)

我建议创建代码更动态

首先,如果您有自定义类来创建导航抽屉,请使用侦听器从您的活动中调用方法 有类调用HomeFragment扩展Fragment,所以我们有:

if(condition){
    fragment = new HomeFragment();
    // if there is Listener
    if(mListener != null){
        mListener.someMethod
    }
    // Other Settings And Codes
}

答案 5 :(得分:0)

public class MainActivity extends AppCompatActivity {



// ...



@Override

protected void onCreate(Bundle savedInstanceState) {

    // ...From section above...

    // Find our drawer view

    nvDrawer = (NavigationView) findViewById(R.id.nvView);

    // Setup drawer view

    setupDrawerContent(nvDrawer);

}



private void setupDrawerContent(NavigationView navigationView) {

    navigationView.setNavigationItemSelectedListener(

            new NavigationView.OnNavigationItemSelectedListener() {

                @Override

                public boolean onNavigationItemSelected(MenuItem menuItem) {

                    selectDrawerItem(menuItem);

                    return true;

                }

            });

}



public void selectDrawerItem(MenuItem menuItem) {

    // Create a new fragment and specify the fragment to show based on nav item clicked

    Fragment fragment = null;

    Class fragmentClass;

    switch(menuItem.getItemId()) {

        case R.id.nav_first_fragment:

            fragmentClass = FirstFragment.class;

            break;

        case R.id.nav_second_fragment:

            fragmentClass = SecondFragment.class;

            break;

        case R.id.nav_third_fragment:

            fragmentClass = ThirdFragment.class;

            break;

        default:

            fragmentClass = FirstFragment.class;

    }



    try {

        fragment = (Fragment) fragmentClass.newInstance();

    } catch (Exception e) {

        e.printStackTrace();

    }



    // Insert the fragment by replacing any existing fragment

    FragmentManager fragmentManager = getSupportFragmentManager();

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



    // Highlight the selected item has been done by NavigationView

    menuItem.setChecked(true);

    // Set action bar title

    setTitle(menuItem.getTitle());

    // Close the navigation drawer

    mDrawer.closeDrawers();

}



// ...

}

相关问题