导航抽屉和Android中的活动

Posted

技术标签:

【中文标题】导航抽屉和Android中的活动【英文标题】:Navigation Drawer and with Activity in Android 【发布时间】:2014-10-29 11:46:33 【问题描述】:

我正在尝试this tutorial. 中给出的导航抽屉(幻灯片菜单)

上述链接和我的不同之处在于,我尝试调用活动而不是调用片段。当应用程序打开时,我看不到导航抽屉菜单,我只能看到打开 HOME 活动的操作栏。

这是我更改的代码:(是否需要有一个片段或者我可以在导航抽屉中的第一个屏幕上使用活动?)

    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);

如何解决此问题以在我的 Home Activity 上显示导航抽屉?

更新:

我什至尝试了此链接中给出的以下选项:

How can I call one of my activity using navigation drawer ? 但我仍然没有得到导航幻灯片菜单。

【问题讨论】:

您实际上并没有展示任何用于设置导航抽屉的代码。例如,您似乎没有ActionBarDrawerToggle,这是实际将导航抽屉图标放在操作栏中的部分。 @Tanis.7x - 我已经更新了我的问题。请立即查看!谢谢! 正如@Soutu 已经指出的那样:NavigationDrawer 仅适用于one Activity,您可以在其中交换几个 Fragments。如果您使用的是androidStudio,您可以在New Project 下创建一个NavigationDrawer Activity,这为您提供了一个很好的起点。 请查看此链接,它可能对您有所帮助[导航抽屉与活动][1] [1]:***.com/questions/19442378/… 请查看此链接,它可能对您有所帮助。 [链接][1] [1]:***.com/questions/19442378/… 【参考方案1】:

你不能这样做... 导航抽屉是一个活动的布局,你不能在另一个活动中显示一个活动,你需要为此使用片段!

一个activity就是一个屏幕,你不能在另一个屏幕里面显示一个屏幕,但是一个fragment可以是一个屏幕的一个组件,你可以在一个activity的容器内给一个fragment充气然后展示给用户。

如果你不想这样做,你可以创建一个抽象的活动并继承,但你不会在一个片段中拥有一个活动,你会有多个活动,每个活动都有自己的导航抽屉。

【讨论】:

是的。 NavigationDrawer 是一个布局,而不是包含 FrameLayout 意味着膨胀 Fragments 而不是活动...【参考方案2】:

如果您查看 Android 导航抽屉的示例文档,它被明确定义为使用片段而不是活动来从导航栏加载不同的“页面”。随着 Android 应用生命周期的推移,片段更容易加载,对 Android 系统的影响也更小。它们也可以很容易地设置到背景中并被其他不同的片段替换。

话虽如此,您最好的方法是将您的活动转换为片段,并使用它们在您的应用中加载您需要的不同页面。这不是一项艰巨的任务,我将向您展示如何:

    将所有活动更改为片段

    public class nameOfFragment extends Fragment  
    

    使用 onCreateView 方法代替 onCreate

    public View onCreateView() 
    
        View view = inflater.inflate(R.layout.activity_main, container, false);
    
        //any other elements in that view need to be included here in this manner.
        Button rate = (Button) rootView.findViewById(R.id.rate);
    
        return view;
    
    

这些更改应该足以将您的活动变成片段。 您需要对通过导航栏访问的所有片段执行相同操作。

如果您需要任何进一步的帮助,请发布您正在使用的活动的代码。 希望这会有所帮助:)

【讨论】:

我没有这样做。我正在寻找解决方法,为什么我要否决您的解决方案。让我试试你的解决方案。 好的,谢谢。不要犹豫,问你是否发现任何困难。我们随时为您提供帮助。 谢谢.. 其实问题是我想找到是否有必要有一个片段或者我可以在导航抽屉中为我的第一个屏幕使用活动? 嗨@TheDevMan,这是我所知道的唯一方法,能够通过导航抽屉加载不同的屏幕。这是因为应用程序的生命周期允许系统轻松显示和隐藏它们,而不会完全破坏它们。 嗨@TheDevMan 这对你有帮助吗?【参考方案3】:

您已经获得了构建和显示导航栏的代码,对吧?将上面的代码放入基础活动类中。然后,您要从中访问导航栏的每个活动都应该从该基类继承。

Google 的 IO 2014 应用程序做同样的事情,看看他们的来源 here。

执行此操作时,您需要找到一种方法来在转换到下一个活动时保持抽屉的状态。我不知道该怎么做,但您可能会在 IO 应用的源代码中找到答案。

【讨论】:

嗨,您有没有找到任何方法来维护抽屉的状态,因为我正在对活动使用导航,但是当按下返回按钮时,我的导航会锁定以前的活动。【参考方案4】:

如果您必须有一个抽屉实例,那么您必须按片段进行。

如果除了活动之外别无选择,请为所有活动定义一个基类(例如 BaseActivity)。在 BaseActivity - 你可以做必要的编码来集成抽屉。每个扩展 BaseActivity 的活动现在都将显示抽屉菜单(但实例会有所不同)

【讨论】:

【参考方案5】:

现在您需要使用工具栏。 Android 已经制作了 appcompat 库来在旧版本的 android 中引入材料设计。您需要使用 appcompat 的编译依赖项。 更改 style.xml

<resources>

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

</resources>

然后我们将选择没有旧的操作栏。之后,我们在navigation drawer 和工具栏之间签订合同。所以我们现在不需要使用旧的操作栏。 您可以参考以下代码:

<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_
    android:layout_
    android:background="#ff6d7fe2"
    app:contentInsetEnd="0dp"
    app:contentInsetStart="0dp"
    ></android.support.v7.widget.Toolbar>

【讨论】:

以上是关于导航抽屉和Android中的活动的主要内容,如果未能解决你的问题,请参考以下文章

android studio 不创建导航抽屉活动

Android:多个活动的导航抽屉

如何实现一个滑动整个活动内容的 Android 导航抽屉?

带有片段的 Android Studio 导航抽屉。工具栏隐藏在下一个片段活动或页面中

多个活动上的 Android 导航抽屉

如何在所有活动中使用Android Studio默认导航抽屉[重复]