抽屉式导航栏,并在Android的

问题描述:

活动我尝试在http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/抽屉式导航栏,并在Android的

上面链接的差给出的导航抽屉(滑轨菜单)和我是不是调用片段,我试图调用活动。当应用程序打开时,我无法看到“导航”抽屉菜单,我只能看到打开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); 
} 

我该如何解决这个问题,以显示我家活动中的导航抽屉?

更新:

我甚至尝试在这个环节给出以下选项:

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

+0

您实际上没有显示任何设置导航抽屉的代码。例如,你似乎没有一个'ActionBarDrawerToggle',它实际上将导航图标放在操作栏中。 – 2014-09-04 18:15:23

+0

@ Tanis.7x - 我已经更新了我的问题。请现在看看它!谢谢! – TheDevMan 2014-09-04 18:30:54

+0

正如@Soutu已经指出的那样:'NavigationDrawer'只能在'一个Activity'中工作,在这里你可以交换**几个''Fragments''。如果您正在使用'AndroidStudio',则可以在'New Project'下创建一个'NavigationDrawer' Activity,这为您提供了一个很好的起点。 – longilong 2014-10-29 09:15:56

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

活动是一个屏幕,您不能在另一个屏幕内显示屏幕,但片段可能是屏幕的一个组件,并且您可以在活动的容器内对片段进行充气,然后向用户显示。

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

+0

是的。 'NavigationDrawer'是一个布局,而不是包含一个'FrameLayout'的意思是膨胀'碎片'不活动... – shkschneider 2014-11-03 13:46:24

如果您查看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); 
    
        //any other elements in that view need to be included here in this manner. 
        Button rate = (Button) rootView.findViewById(R.id.rate); 
    
        return view; 
    } 
    

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

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

+1

我没有这样做。我正在寻找解决方法为什么我想要为您的解决方案投票。让我试试你的解决方案。 – TheDevMan 2014-11-03 03:45:55

+0

好的,谢谢。不要犹豫,问你是否有困难。我们在这里提供帮助。 – 2014-11-03 06:25:13

+1

谢谢..其实问题是我想找到的是有必要有一个片段,或者我可以使用导航抽屉中的第一个屏幕的活动? – TheDevMan 2014-11-03 09:00:38

你有代码来建立和显示导航栏吧?将上面的代码放到基本活动类中。您想要访问导航栏的每个活动都应该从该基类继承。

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

当您这样做时,您需要找到一种方法来在转换到下一个活动时维护抽屉的状态。我不知道该怎么做,但你可能会在IO应用程序的源代码中找到答案。

+0

嗨,你有没有找到任何方式来维护抽屉的状态,因为我使用导航的活动,但当按下我的导航按钮以前的活动锁。 – Pihu 2016-05-06 05:43:14

如果你必须有单个抽屉实例,那么你必须去碎片。

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

现在您需要使用工具栏。 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_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="#ff6d7fe2" 
    app:contentInsetEnd="0dp" 
    app:contentInsetStart="0dp" 
    ></android.support.v7.widget.Toolbar>