How to Display Navigation Drawer in all activities?

后端 未结 8 1231
刺人心
刺人心 2020-11-27 13:39

I have a Navigation Drawer which should appear in all my activities.

I saw many questions similar to this & found a solution like Extending the Main

相关标签:
8条回答
  • 2020-11-27 14:07

    Nowadays you should use Single-Activity App Architecture (source).

    Then simple add Navigation Drawer to Main Activity

    0 讨论(0)
  • 2020-11-27 14:09

    You omitted the @Override from your derived class onCreate.

    UPDATE: I'm not sure what the effects are of calling setContentView twice but that could be the problem. Separate out the code that sets up the drawer, and call that from both of the onCreate methods.

    0 讨论(0)
  • 2020-11-27 14:10

    in onCreate of TutorialActivity don't call setContentView instead do this:

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        LayoutInflater inflater = (LayoutInflater) this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View contentView = inflater.inflate(R.layout.help, null, false);
        mDrawer.addView(contentView, 0); 
    }
    

    make mDrawer in MainActivity protected. and in R.layout.activity_main_drawer just keep drawer tag and the element with gravity left(or right).

    0 讨论(0)
  • 2020-11-27 14:14

    Ok here is hacky way to do this, I use it only for special kind of debug build to set properties of views in realtime (design tool).

    It has advantage that you can use your child activities as usual without, special behavior that is required in different answers.

    so in BaseActvity you can add:

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    
    // WARNING: Hacky, use carefully!!!
    ViewGroup androidBaseView = (ViewGroup) findViewById(android.R.id.content);
    //this one in what child activity has just set in setContentView()
    ViewGroup childContent = (ViewGroup) androidBaseView.getChildAt(0);
    
    View drawerView = LayoutInflater.from(this)
        .inflate(R.layout.base_activity_drawer, androidBaseView, false);
    FrameLayout frameLayout = (FrameLayout) drawerView.findViewById(R.id.content);
    androidBaseView.removeView(childContent);
    frameLayout.addView(childContent);
    androidBaseView.addView(drawerView);
    }
    

    and xml for drawer is just:

      <android.support.v4.widget.DrawerLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/nav_drawer"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:fitsSystemWindows="true">
      <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
      <LinearLayout
        android:id="@+id/drawer_for_components"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:orientation="vertical"
        android:fitsSystemWindows="true"
        />
    </android.support.v4.widget.DrawerLayout>
    
    0 讨论(0)
  • 2020-11-27 14:23

    I made a BaseActivity activity which extends SherlockActivity (or ActionBarActivity if is your case)

    public class BaseActivity extends SherlockActivity
    

    Then, make all your activities extends BaseActivity, like:

    public class GlossaryActivity extends BaseActivity
    

    Later, you must replace the activity layout with the one that correspond to your activity, I made a method in BaseActivity like that:

    protected void replaceContentLayout(int sourceId, int destinationId) {
        View contentLayout = findViewById(destinationId);
    
        ViewGroup parent = (ViewGroup) contentLayout.getParent();
        int index = parent.indexOfChild(contentLayout);
    
        parent.removeView(contentLayout);
        contentLayout = getLayoutInflater().inflate(sourceId, parent, false);
        parent.addView(contentLayout, index);
    }
    

    I called this method on the onCreate method in each activity:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.replaceContentLayout(R.layout.activity_glossary, super.CONTENT_LAYOUT_ID);
    
    }
    

    super.CONTENT_LAYOUT_ID is the FrameLayout of the BaseActivity, and other param is the layout you want replace with

    0 讨论(0)
  • 2020-11-27 14:24

    Here is a simple and fast way to do it in android studio:

    1. Create a new activity (Navigation drawer activity) from the gallery, and name it whatever you want, android studio will create everything for you (the class and the xml files that you can customize it later)

    2. In other activities you should extend your Navigation drawer activity, and make sure these other activities has "no action bar" in the manifests file (android:theme="@style/AppTheme.NoActionBar")

    3. You should modify your other activities as follows:

      public class Mainactivity extends NavActivity
      {
      super.onCreate(savedInstanceState);
         LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         //inflate your activity layout here!
         View contentView = inflater.inflate(R.layout.activity_main, null, false);
         drawer.addView(contentView, 0);
      }
      

    Note: the mainactivity will extend the action bar of the NavActivity, the NavActivity has a full functional action bar that will call the navigation drawer

    I hope it will work with you

    0 讨论(0)
提交回复
热议问题