在Android中使用活动和导航抽屉

3
我在尝试使用这个教程中提供的导航抽屉(侧滑菜单)。

与上述链接不同的是,我尝试调用活动而非片段。当应用程序打开时,我无法看到导航抽屉菜单,只能看到带有主页活动的操作栏。

以下是我更改的代码:(在导航抽屉中必须使用片段吗?还是可以在我的第一个屏幕中使用活动?)

    mTitle = mDrawerTitle = getTitle();

    navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
    navMenuIcons = getResources().obtainTypedArray(R.array.nav_drawer_icons);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.left_drawer);    

    navDrawerItems = new ArrayList<NavDrawerItem>();

    navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(1, -1)));
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(2, -1),true, "200"));

    navMenuIcons.recycle();

    mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

    adapter = new NavDrawerListAdapter(getApplicationContext(), navDrawerItems);
    mDrawerList.setAdapter(adapter);

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.drawer,
            R.string.drawer_open,
            R.string.drawer_close
            ) 
    {
        public void onDrawerClosed(View view) 
        {
            getActionBar().setTitle(mTitle);
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) 
        {
            getActionBar().setTitle(mDrawerTitle);
            invalidateOptionsMenu();
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);

    if (savedInstanceState == null) 
    {
        displayView(0);
    }
}

private class SlideMenuClickListener implements
ListView.OnItemClickListener
{
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    {
        displayView(position);
    }
}
private void displayView(int position) 
{
    switch (position) 
    {
    case 0:
        //fragment = new HomeFragment();        

        Intent intent = new Intent(this, Home.class);
        startActivity(intent);

        return;

    case 1:
        //fragment = new FindPeopleFragment();

        Intent intent1 = new Intent(this, Profile.class);
        startActivity(intent1);
        break;

    case 2:
        //fragment = new PhotosFragment();

        Intent intent2 = new Intent(this, Details.class);
        startActivity(intent2);
        break;

    default:
        break;
    }

    mDrawerList.setItemChecked(position, true);
    mDrawerList.setSelection(position);
    setTitle(navMenuTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}

如何修复此问题以在我的主页活动中显示导航抽屉?

更新:

我甚至尝试了此链接中提供的以下选项:,但仍然无法获得导航滑动菜单。


你实际上没有展示任何设置导航抽屉的代码。例如,你似乎没有 ActionBarDrawerToggle 这个组件,它是将导航抽屉图标放置在操作栏中的关键部分。 - Bryan Herbst
@Tanis.7x - 我更新了我的问题,请现在看一下!谢谢! - TheDevMan
正如 @Soutu 已经指出的那样:NavigationDrawer 只能在一个 Activity 中使用,您可以在其中交换 多个 Fragments。如果您正在使用 AndroidStudio,则可以在 New Project 下创建一个 NavigationDrawer Activity,这将为您提供一个良好的起点。 - longi
请查看此链接,它可能会对您有所帮助 使用活动的导航抽屉 - amit kumar
请查看此链接,它可能会对您有所帮助。链接 - amit kumar
@TheDevMan 我也遇到了同样的问题.. 你是怎么解决的? - Bhargav Kumar R
5个回答

2
您不能这样做... 导航抽屉是从一个活动布局中提取的,您不能在另一个活动中显示一个活动,您需要使用片段来实现!
活动是一个屏幕,您不能在另一个屏幕中显示一个屏幕,但是片段可以作为屏幕的组件,并且您可以将片段填充到活动的容器中,然后向用户显示。
如果您想要这样做,您可以创建一个抽象活动并继承它,但是您将不会在片段中拥有一个活动,您将拥有多个活动,每个活动都有自己的导航抽屉。

True. NavigationDrawer 是一个布局,其中包含一个 FrameLayout,用于填充 Fragments 而不是 Activities... - shkschneider

1
现在您需要使用工具栏。Android已经创建了appcompat库,以在旧版本的Android中引入Material Design。您需要使用appcompat的编译依赖。 更改style.xml。
<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
</style>

</resources>

然后我们将选择不使用旧的操作栏。之后,我们在导航抽屉和工具栏之间建立一个协议。因此,我们现在不需要使用旧的操作栏。 您可以参考以下代码:
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ff6d7fe2"
    app:contentInsetEnd="0dp"
    app:contentInsetStart="0dp"
    ></android.support.v7.widget.Toolbar>

1
如果您查看Android导航抽屉的示例文档,它明确定义了使用片段而不是活动从导航栏加载不同的“页面”。随着Android的应用程序生命周期,片段更容易加载并对Android系统产生较少的影响。它们也可以轻松地设置为后台,并被其他不同的片段替换。
话虽如此,您最好的方法是将您的活动转换为片段,并使用它们来加载您在应用程序中需要的不同页面。这并不是一项困难的任务,我将向您展示如何做到这一点:
  1. 将所有活动更改为片段

    public class nameOfFragment extends Fragment { }
    
  2. 使用onCreateView方法而不是onCreate

    public View onCreateView() {
    
        View view = inflater.inflate(R.layout.activity_main, container, false);
    
        //任何其他元素需要以这种方式在此处包含。
        Button rate = (Button) rootView.findViewById(R.id.rate);
    
        return view;
    }
    
这些更改足以将您的活动转换为片段。 您需要对通过导航栏访问的所有片段执行相同操作。 如果需要进一步帮助,请发布您正在使用的活动代码。 希望这可以帮到您 :)

1
我没有做这件事。我正在寻找解决方法,为什么要对你的解决方案进行负评。让我尝试一下你的解决方案。 - TheDevMan
好的,谢谢。如果您遇到任何困难,请不要犹豫,我们会尽力帮助您。 - Michele La Ferla
1
谢谢。其实问题是我想知道在导航抽屉中,是必须要使用Fragment还是可以使用Activity作为第一个屏幕? - TheDevMan
嗨@TheDevMan,这是我知道的唯一方法,可以通过导航抽屉加载不同的屏幕。这是因为应用程序的生命周期允许系统轻松地显示和隐藏它们,而无需完全销毁它们。 - Michele La Ferla
嗨,@TheDevMan,这有帮助到你了吗? - Michele La Ferla

1
你已经有了构建和显示导航栏的代码,对吗?把你的代码放到一个基础活动类中。想要从中访问导航栏的每个活动都应该继承自该基础类。
Google的IO 2014应用程序也是这样做的,可以在这里查看他们的源代码。
当你这样做时,你需要找到一种方法来保持抽屉的状态,以便在切换到下一个活动时不会丢失状态。我不确定如何做到这一点,但你可能会在IO应用程序的源代码中找到答案。

你好,你有找到任何方法来保持抽屉的状态吗?因为我正在使用带有活动的导航,但是当按下返回按钮时,我的导航会锁定到先前的活动。 - Pihu

1
如果您必须拥有抽屉的单个实例,则必须使用片段。如果您没有选择,只能使用活动,则为所有活动定义一个基类(例如BaseActivity)。在BaseActivity中,您可以进行必要的编码以集成抽屉。现在扩展BaseActivity的每个活动都将显示抽屉菜单(但实例将不同)。

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