2015-02-23 4 views
3

Я хочу добавить навигационную панель на все действия моего Android-проекта. Это код MainActivity:Android: Навигатор-ящик во всех видах деятельности

public class MainActivity extends Activity { 


     private String[] drawerListViewItems; 
     private DrawerLayout drawerLayout; 
     private ListView drawerListView; 
     private ActionBarDrawerToggle actionBarDrawerToggle; 

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

      // get list items from strings.xml 
      drawerListViewItems = getResources().getStringArray(R.array.items); 


      // get ListView defined in activity_main.xml 
      drawerListView = (ListView) findViewById(R.id.left_drawer); 

      // Set the adapter for the list view 
      drawerListView.setAdapter(new ArrayAdapter<String>(this, 
        R.layout.drawer_listview_item, drawerListViewItems)); 

      // App Icon 
      drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
      //drawerLayout = (DrawerLayout) findViewById(R.drawable.ic_drawer_2); 

      actionBarDrawerToggle = new ActionBarDrawerToggle(
        this,     /* host Activity */ 
        drawerLayout,   /* DrawerLayout object */ 
        R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */ 
        R.string.drawer_open, /* "open drawer" description */ 
        R.string.drawer_close /* "close drawer" description */ 
        ); 

      // Set actionBarDrawerToggle as the DrawerListener 
      drawerLayout.setDrawerListener(actionBarDrawerToggle); 

      getActionBar().setDisplayHomeAsUpEnabled(true); 

      // just styling option add shadow the right edge of the drawer 
     drawerLayout.setDrawerShadow(R.drawable.ic_drawer, GravityCompat.START); 

     drawerListView.setOnItemClickListener(new DrawerItemClickListener()); 
    } 

    @Override 
     protected void onPostCreate(Bundle savedInstanceState) { 
      super.onPostCreate(savedInstanceState); 
      // Sync the toggle state after onRestoreInstanceState has occurred. 
      actionBarDrawerToggle.syncState(); 
     } 

     @Override 
     public void onConfigurationChanged(Configuration newConfig) { 
      super.onConfigurationChanged(newConfig); 
      actionBarDrawerToggle.onConfigurationChanged(newConfig); 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 

      // call ActionBarDrawerToggle.onOptionsItemSelected(), if it returns true 
      // then it has handled the app icon touch event 
      if (actionBarDrawerToggle.onOptionsItemSelected(item)) { 
       return true; 
      } 
      return super.onOptionsItemSelected(item); 
     } 

     private class DrawerItemClickListener implements ListView.OnItemClickListener { 
      @Override 
      public void onItemClick(AdapterView parent, View view, int position, long id) { 

        displayView(position); 

       drawerLayout.closeDrawer(drawerListView); 

      } 

      private void displayView(int position) 
      { 
       switch (position) 
       { 
       case 0: 
        secondactivity(); 
        break; 


       case 1: 
        Toast.makeText(MainActivity.this, "2", Toast.LENGTH_LONG).show(); 
        break; 

       case 2: 
        Toast.makeText(MainActivity.this, "3", Toast.LENGTH_LONG).show(); 

       default: 
        break; 
       } 

      } 
     } 

     public void secondactivity(){ 

      Intent cambioActivity; 

      cambioActivity = new Intent (this, SecondActivity.class); 

      startActivity(cambioActivity); 
     } 
} 

В этом коде я создаю панель навигации, я хочу, панель навигации по всем видам деятельности, поэтому код моей Второго вида деятельности заключается в следующем:

public class SecondActivity extends MainActivity { 

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

    } 

навигация ящик находится на первом мероприятии, но нет других действий, почему? Кто-нибудь может мне помочь?

+0

Посмотрите на Google IO графика приложение исходный код – Raghunandan

+2

MainActivity становится заменен другой деятельностью. Используйте Framelayout и фрагменты, это должно решить вашу проблему. – Psypher

+0

Определены ли вы в файле R.id.left_drawer activity_secondactivity.xml? Кроме того, вы должны только вызвать setContentView один раз –

ответ

1

Простым способом является создание фрагментов. Если вы готовы к чему-то тяжело, то это для вас. Он позволит вам иметь тот же навигационный ящик во всех мероприятиях.

Создать drawer_n_activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

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

<YourDrawer 
    android:id="@+id/drawer_drawer" 
    android:layout_width="match_parent" 
    android:layout_height="fill_parent" > 

</YourDrawer> 

</RelativeLayout> 

Ваш DrawerActivity.class

public class DrawerActivity extends Activity { 

    public RelativeLayout fullLayout; 
    public FrameLayout frameLayout; 

    @Override 
    public void setContentView(int layoutResID) { 

     fullLayout = (RelativeLayout) getLayoutInflater().inflate(R.layout.drawer_n_activity, null); 
     frameLayout = (FrameLayout) fullLayout.findViewById(R.id.drawer_frame); 

     getLayoutInflater().inflate(layoutResID, frameLayout, true); 

     super.setContentView(fullLayout); 

     //Your drawer content... 

    } 
} 

Теперь, чтобы включить же панель навигации во всех делах и ум еще одна вещь, все ваши действия должны распространятьсяDrawerActivity

public class MainActivity extends DrawerActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); //layout for 1st activity 
    } 
} 

public class SecondActivity extends DrawerActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.second_activity); //layout for 2nd activity 
    } 
} 
+0

Это решение хорошо, навигационный ящик отображается во всех действиях, но я не могу поместить макет других действий, когда я вставляю «setContentView (R.layout.activity_main)»; это решение не выполняется. Как я могу сделать? – user3582433

+2

Использование фрагментов - отличная альтернатива, но вопрос - это Navigation-Drawer во всех действиях. –

2

Хорошо, ребята поделятся своим путем. Я делаю это (в случае, если вы разрабатываете проект за кем-то и уже много развлечений).

Наконец я надуть навигации ящик с одной строки кода (в onCreate):

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mContext = this; //context 
     //setContentView(R.layout.activity_favorites); // Was so 
     Utils.inflatedNavigationDrawerView(mContext, R.layout.activity_favorites); // Now is 
     //... 
    } 

рядом что такое Utils? :

public class Utils{ 

public static void inflatedNavigationDrawerView(Context context, int layoutId){ 
     // Here get view of clear DrawerLayout 
     final View drawerLayout = View.inflate(context,R.layout.navigation_drawer_inflator, null); 
     // Next inflate to it passed layout for activity 
     final View mainLayout = View.inflate(context,layoutId, (ViewGroup) drawerLayout); 
     // And finally inflate to it fragment for NavigationDraver 
     final View fragmentLayout = View.inflate(context,R.layout.navigation_drawer_inflator_fragment, (ViewGroup) drawerLayout); 

     // Next we should try to get our drawer (should check with casting to each activity you want to insert to) 
     NavigationDrawerFragment drawerFragment = null; 

     // this block should be repeated for each activity you want to use in.  
     if (context instanceof FavoritesActivity){ 
      // Set our pack of inflates to contentview 
      ((FavoritesActivity) context).setContentView(mainLayout); 
      // And now we get NavigationDrawerFragment 
      drawerFragment = (NavigationDrawerFragment) 
        ((FavoritesActivity) context).getSupportFragmentManager().findFragmentById(R.id.navigation_drawer_fragment); 
     } 

     if(drawerFragment != null){ // if null then we missed some castings for activity used in. 
      // Finally setup our drawer 
      drawerFragment.setUpEasy(R.id.navigation_drawer_fragment, (DrawerLayout)drawerLayout.findViewById(R.id.drawer_layout), (Toolbar) mainLayout.findViewById(R.id.app_bar)); 
     } 
    } 
} 

Если вы хотите, чтобы избежать создания гамбургеров в панели инструментов, то вам следует в setUpEasy месте: mDrawerToggle.setDrawerIndicatorEnabled(false);

Вот мой образец установки:

public void setUpEasy(int fragmentId, DrawerLayout drawerLayout, Toolbar toolBar) { 
     mContainerView = getActivity().findViewById(fragmentId); 
     mDrawerLayout = drawerLayout; 


     mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolBar, R.string.open, R.string.close){ 

      @Override 
      public void onDrawerOpened(View drawerView) { 
       super.onDrawerOpened(drawerView); 
       if(!mUserLearnedDrawer){ 
        mUserLearnedDrawer = true; 
        saveToPreferences(getActivity(), Constants.PREFERENCES_LEARNDRAWER_KEY, mUserLearnedDrawer+""); 
       } 
      } 

      @Override 
      public void onDrawerClosed(View drawerView) { 
       super.onDrawerClosed(drawerView); 
      } 


     }; 
     mDrawerToggle.setDrawerIndicatorEnabled(false); // If false then no hamburger menu. 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 
     mDrawerLayout.post(new Runnable() { 
      @Override 
      public void run() { 
       mDrawerToggle.syncState(); 
      } 
     }); 
    } 

и виды, используемые:

// navigation_drawer_inflator.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:dragAndDrop="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/drawer_layout" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

</android.support.v4.widget.DrawerLayout> 

// navigation_drawer_inflator_fragment.xml

<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/navigation_drawer_fragment" 
    android:layout_width="@dimen/navigation_drawer_width" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:layout_marginTop="56dp" 
    app:layout="@layout/fragment_navigation_drawer" 
    tools:layout="@layout/fragment_navigation_drawer" /> 

Наконец, если вы реализуете это - Вы сможете вставить панель навигации в любой деятельности по пробегу. Cheers :)

0

Вот как я это сделал. Создайте вспомогательный класс. Я также добавил дополнительный код для возможности завершения() класса.

public class NavDrawerHelper extends ContextWrapper{ 

public NavDrawerHelper(Context context){ 
    super(context); 
} 

    public void initNav(final DrawerLayout drawerLayout, NavigationView navigationView, Toolbar toolbar, final boolean isFinish){ 

    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { 
      int id = menuItem.getItemId(); 
      switch (id){ 
       case R.id.nav_home: 
        startActivity(new Intent(getBaseContext(), MainActivity.class)); 
        if (isFinish) ((Activity)getBaseContext()).finish(); 
        drawerLayout.closeDrawers(); 
        break; 
       case R.id.nav_settings: 
        startActivity(new Intent(getBaseContext(), SettingsActivity.class)); 
        if (isFinish) ((Activity)getBaseContext()).finish(); 
        drawerLayout.closeDrawers(); 
        break; 
      } 
      return true; 
     } 
    }); 

    ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(((Activity)getBaseContext()),drawerLayout,toolbar,R.string.drawer_open,R.string.drawer_close){ 
     @Override 
     public void onDrawerClosed(View v){ 
      super.onDrawerClosed(v); 
     } 
     @Override 
     public void onDrawerOpened(View v) { 
      super.onDrawerOpened(v); 
     } 
    }; 
    drawerLayout.addDrawerListener(actionBarDrawerToggle); 
    actionBarDrawerToggle.syncState(); 
} 

}

затем добавить этот код на все виды деятельности.Это заменяет существующий метод initNavigationDrawer().

public void initNavigationDrawer() { 
    //views 
    NavigationView navigationView = findViewById(R.id.navigation_view); 
    DrawerLayout drawerLayout = findViewById(R.id.drawer); 

    NavDrawerHelper navDrawerHelper = new NavDrawerHelper(this); 
    navDrawerHelper.initNav(drawerLayout, navigationView, toolbar, false); 

}