web-dev-qa-db-ja.com

さまざまなアクティビティで同じナビゲーションパネル

developer.Android.com のWebサイトのチュートリアルに表示されているように、実用的なナビゲーション用の引き出しを作りました。しかし今、私は1つのNavigation Drawerを使用したいのですが、私は自分のアプリケーションの複数のアクティビティに対してNavigationDrawer.classで作成しました。

私の質問は、もしここにいる誰かが小さなチュートリアルを作ることができるのであれば、それは複数のアクティビティのために一つのナビゲーション引き出しを使う方法を説明しています。

私はこの答えでそれを最初に読みました 複数のアクティビティに関するAndroidナビゲーション引き出し

私のプロジェクトではうまくいきませんでした

public class NavigationDrawer extends Activity {
public DrawerLayout drawerLayout;
public ListView drawerList;
private ActionBarDrawerToggle drawerToggle;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout, R.drawable.ic_drawer, 0, 0) {

        public void onDrawerClosed(View view) {
            getActionBar().setTitle(R.string.app_name);
        }

        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(R.string.menu);
        }
    };
    drawerLayout.setDrawerListener(drawerToggle);

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

    layers = getResources().getStringArray(R.array.layers_array);
    drawerList = (ListView) findViewById(R.id.left_drawer);
    View header = getLayoutInflater().inflate(R.layout.drawer_list_header, null);
    drawerList.addHeaderView(header, null, false);
    drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, Android.R.id.text1,
            layers));
    View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
            R.layout.drawer_list_footer, null, false);
    drawerList.addFooterView(footerView);

    drawerList.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
            map.drawerClickEvent(pos);
        }
    });
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if (drawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    return super.onOptionsItemSelected(item);

}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    drawerToggle.syncState();
}

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

このアクティビティではNavigation Drawerを使用したいので、 'NavigationDrawer'を拡張します。他のアクティビティでは、同じNavigation Drawerを使用します。

  public class SampleActivity extends NavigationDrawer {...}

何を変更すればよいのかわかりません….

192
MEX

ナビゲーションドロワーが必要な場合は、フラグメントを使用してください。私は先週このチュートリアルをフォローしました、そしてそれはとてもうまくいきます:

http://developer.Android.com/training/implementing-navigation/nav-drawer.html

このチュートリアルからサンプルコードをダウンロードして、これを実行する方法を確認することもできます。


フラグメントなし

これはあなたのBaseActivityコードです:

public class BaseActivity extends Activity
{
    public DrawerLayout drawerLayout;
    public ListView drawerList;
    public String[] layers;
    private ActionBarDrawerToggle drawerToggle;
    private Map map;

    protected void onCreate(Bundle savedInstanceState)
    {
        // R.id.drawer_layout should be in every activity with exactly the same id.
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout, R.drawable.ic_drawer, 0, 0) 
        {
            public void onDrawerClosed(View view) 
            {
                getActionBar().setTitle(R.string.app_name);
            }

            public void onDrawerOpened(View drawerView) 
            {
                getActionBar().setTitle(R.string.menu);
            }
        };
        drawerLayout.setDrawerListener(drawerToggle);

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

        layers = getResources().getStringArray(R.array.layers_array);
        drawerList = (ListView) findViewById(R.id.left_drawer);
        View header = getLayoutInflater().inflate(R.layout.drawer_list_header, null);
        drawerList.addHeaderView(header, null, false);
        drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, Android.R.id.text1,
                layers));
        View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
                R.layout.drawer_list_footer, null, false);
        drawerList.addFooterView(footerView);

        drawerList.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
                map.drawerClickEvent(pos);
            }
        });
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        if (drawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        return super.onOptionsItemSelected(item);

    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        drawerToggle.syncState();
    }

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

ナビゲーションドロワーを持つ必要がある他のすべてのアクティビティは、アクティビティ自体ではなくこのアクティビティを拡張する必要があります。次に例を示します。

public class AnyActivity extends BaseActivity
{
    //Because this activity extends BaseActivity it automatically has the navigation drawer
    //You can just write your normal Activity code and you don't need to add anything for the navigation drawer
}

XML

<Android.support.v4.widget.DrawerLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    <!-- The main content view -->
    <FrameLayout
        Android:id="@+id/content_frame"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" >
        <!-- Put what you want as your normal screen in here, you can also choose for a linear layout or any other layout, whatever you prefer -->
    </FrameLayout>
    <!-- The navigation drawer -->
    <ListView Android:id="@+id/left_drawer"
        Android:layout_width="240dp"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:choiceMode="singleChoice"
        Android:divider="@Android:color/transparent"
        Android:dividerHeight="0dp"
        Android:background="#111"/>
</Android.support.v4.widget.DrawerLayout>

編集:

私は自分自身でいくつかの困難を経験したので、あなたがNullPointerExceptionsを得たならば、これは解決策です。 BaseActivityでonCreate関数をprotected void onCreateDrawer()に変更します。残りは同じままにすることができます。 BaseActivityを拡張するアクティビティでは、コードをこの順序で配置します。

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);
    super.onCreateDrawer();

これは私が私の問題を解決するのを助けました。

質問がある場合は、これで複数のアクティビティを含むナビゲーションドロワーを作成できます。


編集2:

@GregDanが言ったように、あなたのBaseActivitysetContentView()をオーバーライドして、そこでonCreateDrawerを呼び出すことができます。

@Override 
public void setContentView(@LayoutRes int layoutResID) 
{ 
    super.setContentView(layoutResID); 
    onCreateDrawer() ;
}
175

最良の実装を見つけました。これは Google I/O 2014 アプリにあります。

彼らはケビンのものと同じアプローチを使います。 I/Oアプリ内の不要なものすべてから抽象化できれば、必要なものすべてを抽出でき、それはナビゲーション引き出しパターンの正しい使い方であるとGoogleによって保証されています。各アクティビティはオプションでメインレイアウトとしてDrawerLayoutを持ちます。興味深い部分は、他の画面への移動方法です。これは次のようにBaseActivityに実装されています。

private void goToNavDrawerItem(int item) {
        Intent intent;
        switch (item) {
            case NAVDRAWER_ITEM_MY_SCHEDULE:
                intent = new Intent(this, MyScheduleActivity.class);
                startActivity(intent);
                finish();
                break;

これは、現在のフラグメントをフラグメントトランザクションで置き換える一般的な方法とは異なります。しかし、ユーザーは視覚的な違いを見つけません。

34
WindRider

したがって、この答えは数年遅れていますが、誰かがそれを高く評価するかもしれません。 Androidは、1つのナビゲーションドロワーを複数のアクティビティで簡​​単に使用できるようにする新しいウィジェットを提供します。

Android.support.design.widget.NavigationViewはモジュール式で、メニューフォルダーに独自のレイアウトがあります。それを使用する方法は、xmlレイアウトを次のようにラップすることです。

  1. ルートレイアウトは、2つの子を含むAndroid.support.v4.widget.DrawerLayoutです。ラップされるレイアウトの<include ... />(2を参照)とAndroid.support.design.widget.NavigationViewです。

    <Android.support.v4.widget.DrawerLayout
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:app="http://schemas.Android.com/apk/res-auto"
        xmlns:tools="http://schemas.Android.com/tools"
        Android:id="@+id/drawer_layout"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:fitsSystemWindows="true"
        tools:openDrawer="start">
    
    <include
        layout="@layout/app_bar_main"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />
    
    <Android.support.design.widget.NavigationView
        Android:id="@+id/nav_view"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />
    

nav_header_mainは、Navigation Drawarのヘッダーのorientation = verticalのLinearLayoutです。

activity_main_drawerは、res/menuディレクトリにあるメニューxmlです。選択したアイテムとグループを含めることができます。 AndroidStudioギャラリーを使用する場合、ウィザードが基本的なウィザードを作成し、オプションが何であるかを確認できます。

  1. 通常、アプリバーのレイアウトはAndroid.support.design.widget.CoordinatorLayoutになり、これには2つの子が含まれます:Android.support.design.widget.AppBarLayout(Android.support.v7.widget.Toolbarを含む)と<include ... >実際のコンテンツ(3を参照)。

    <Android.support.design.widget.CoordinatorLayout
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:app="http://schemas.Android.com/apk/res-auto"
        xmlns:tools="http://schemas.Android.com/tools"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        tools:context="yourpackage.MainActivity">
    
     <Android.support.design.widget.AppBarLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:theme="@style/AppTheme.AppBarOverlay">
    
        <Android.support.v7.widget.Toolbar
            Android:id="@+id/toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="?attr/actionBarSize"
            Android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
    
    </Android.support.design.widget.AppBarLayout>
    
    <include layout="@layout/content_main" />
    
  2. コンテンツレイアウトは、任意のレイアウトにすることができます。これは、アクティビティのメインコンテンツを含むレイアウトです(ナビゲーションドロワーまたはアプリバーは含まれません)。

さて、これらのすべての素晴らしい点は、これらの2つのレイアウトで各アクティビティをラップできますが、NavigationView(ステップ1を参照)が常にactivity_main_drawer(またはその他)を指すようにすることです。つまり、すべてのアクティビティで同じ(*)ナビゲーションドロワーを使用できます。

  • これらはNavigationViewの同じinstanceではありませんが、公平に言えば、上記のBaseActivityソリューションでも不可能でした。
7
jwehrle

オリジナルのポスターが求めていることをやろうと思っている人には、代わりにフラグメントを使用することを検討してください。これを行う方法に関する優れたチュートリアルがあります。

https://github.com/codepath/Android_guides/wiki/Fragment-Navigation-Drawer

フラグメントの代わりにアクティビティを使用することを選択した場合は、新しいアクティビティに移動するたびにナビゲーションパネルが再作成されるという問題に遭遇することになります。その結果、毎回navドロワーのレンダリングが醜く遅くなります。

7
Micro

私の提案は、アクティビティをまったく使用せず、代わりにフラグメントを使用して、最初のフラグメントを表示しているコンテナ(たとえばリニアレイアウト)内でそれらを置き換えることです。

コードはAndroid Developer Tutorialsで入手できます、あなたはただカスタマイズする必要があります。

http://developer.Android.com/training/implementing-navigation/nav-drawer.html

あなたのアプリケーションでもっともっと多くのフラグメントを使うべきであり、あなたのアプリケーションに対してローカルな4つの基本的なアクティビティだけがあるべきである、あなたがあなたのAndroidManifest.xmlであなたが言及することはあなたが外部のものから離れて言及する(例えばFacebookActivity):

  1. SplashActivity:フラグメントを使用せず、FullScreenテーマを使用します。

  2. LoginSignUpActivity:NavigationDrawerをまったく必要とせず、戻るボタンも必要としないため、通常のツールバーを使用するだけですが、少なくとも3つまたは4つのフラグメントが必要になります。ノーアクションバーテーマを使用

  3. HomeActivityまたはDashBoard Activity:ノーアクションバーテーマを使用します。ここでは、ナビゲーションドロワーが必要です。また、それに続くすべての画面は、共有ドロワーを使用して、リーフビューまでフラグメントまたはネストされたフラグメントになります。このアクティビティでは、すべての設定、ユーザープロファイルなどがここにフラグメントとして表示されます。ここでのフラグメントはバックスタックに追加されず、引き出しメニュー項目から開かれます。引き出しの代わりに戻るボタンを必要とする断片の場合、以下に4番目の種類のアクティビティがあります。

  4. 引き出しなしの活動。このアクティビティの上部には戻るボタンがあり、内部のフラグメントは同じアクションバーを共有します。ナビゲーション履歴があるため、これらのフラグメントはバックスタックに追加されます。

[詳細なガイダンスについては、 https://stackoverflow.com/a/51100507/787399 ]を参照してください。

ハッピーコーディング!

5
Abhinav Saxena

アクティビティのグループ間で共通のナビゲーションパネルを再利用する最も簡単な方法

app_base_layout.xml

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

    <FrameLayout
        Android:id="@+id/view_stub"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">

    </FrameLayout>

    <Android.support.design.widget.NavigationView
        Android:id="@+id/navigation_view"
        Android:layout_width="240dp"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        app:menu="@menu/menu_test"
        />
</Android.support.v4.widget.DrawerLayout>

AppBaseActivity.Java

/*
* This is a simple and easy approach to reuse the same 
* navigation drawer on your other activities. Just create
* a base layout that conains a DrawerLayout, the 
* navigation drawer and a FrameLayout to hold your
* content view. All you have to do is to extend your 
* activities from this class to set that navigation 
* drawer. Happy hacking :)
* P.S: You don't need to declare this Activity in the 
* AndroidManifest.xml. This is just a base class.
*/
import Android.content.Intent;
import Android.content.res.Configuration;
import Android.os.Bundle;
import Android.support.design.widget.NavigationView;
import Android.support.v4.widget.DrawerLayout;
import Android.support.v7.app.ActionBarDrawerToggle;
import Android.support.v7.app.AppCompatActivity;
import Android.view.LayoutInflater;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.FrameLayout;

public abstract class AppBaseActivity extends AppCompatActivity implements MenuItem.OnMenuItemClickListener {
    private FrameLayout view_stub; //This is the framelayout to keep your content view
    private NavigationView navigation_view; // The new navigation view from Android Design Library. Can inflate menu resources. Easy
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    private Menu drawerMenu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.app_base_layout);// The base layout that contains your navigation drawer.
        view_stub = (FrameLayout) findViewById(R.id.view_stub);
        navigation_view = (NavigationView) findViewById(R.id.navigation_view);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 0, 0);
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        drawerMenu = navigation_view.getMenu();
        for(int i = 0; i < drawerMenu.size(); i++) {
          drawerMenu.getItem(i).setOnMenuItemClickListener(this);
        }
        // and so on...
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }

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

    /* Override all setContentView methods to put the content view to the FrameLayout view_stub
     * so that, we can make other activity implementations looks like normal activity subclasses.
     */
    @Override
    public void setContentView(int layoutResID) {
        if (view_stub != null) {
            LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT);
            View stubView = inflater.inflate(layoutResID, view_stub, false);
            view_stub.addView(stubView, lp);
        }
    }

    @Override
    public void setContentView(View view) {
        if (view_stub != null) {
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT);
            view_stub.addView(view, lp);
        }
    }

    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        if (view_stub != null) {
            view_stub.addView(view, params);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Pass the event to ActionBarDrawerToggle, if it returns
        // true, then it has handled the app icon touch event
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        // Handle your other action bar items...

        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item1:
                // handle it
                break;
            case R.id.item2:
                // do whatever
                break;
            // and so on...
        }
        return false;
    }
}
3
Levon Petrosyan
package xxxxxx;



import Android.app.SearchManager;
import Android.content.Context;
import Android.content.Intent;
import Android.widget.SearchView;
import Android.support.design.widget.NavigationView;
import Android.support.v4.widget.DrawerLayout;
import Android.support.v7.app.ActionBarDrawerToggle;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.support.v7.widget.Toolbar;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;
import Android.widget.Toast;


public class loginhome extends AppCompatActivity {
    private Toolbar toolbar;
    private NavigationView navigationView;
    private DrawerLayout drawerLayout;

    // Make sure to be using Android.support.v7.app.ActionBarDrawerToggle version.
    // The Android.support.v4.app.ActionBarDrawerToggle has been deprecated.
    private ActionBarDrawerToggle drawerToggle;

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

        // Initializing Toolbar and setting it as the actionbar
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        //Initializing NavigationView


        navigationView = (NavigationView) findViewById(R.id.nav_view);

        //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {

            // This method will trigger on item Click of navigation menu

            public boolean onNavigationItemSelected(MenuItem menuItem) {


                //Checking if the item is in checked state or not, if not make it in checked state
                if(menuItem.isChecked()) menuItem.setChecked(false);
                else menuItem.setChecked(true);

                //Closing drawer on item click
                drawerLayout.closeDrawers();

                //Check to see which item was being clicked and perform appropriate action
                switch (menuItem.getItemId()){


                    //Replacing the main content with ContentFragment Which is our Inbox View;
                    case R.id.nav_first_fragment:
                        Toast.makeText(getApplicationContext(),"First fragment",Toast.LENGTH_SHORT).show();
                         FirstFragment fragment = new FirstFragment();
                        Android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.frame,fragment);
                        fragmentTransaction.commit();
                        return true;

                    // For rest of the options we just show a toast on click
                    case R.id.nav_second_fragment:
                        Toast.makeText(getApplicationContext(),"Second fragment",Toast.LENGTH_SHORT).show();
                        SecondFragment fragment2 = new SecondFragment();
                        Android.support.v4.app.FragmentTransaction fragmentTransaction2 = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction2.replace(R.id.frame,fragment2);
                        fragmentTransaction2.commit();
                        return true;

                    default:
                        Toast.makeText(getApplicationContext(),"Somethings Wrong",Toast.LENGTH_SHORT).show();
                        return true;

                }
            }
        });

        // Initializing Drawer Layout and ActionBarToggle
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.drawer_open, R.string.drawer_close){

            @Override
            public void onDrawerClosed(View drawerView) {
                // Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank
                super.onDrawerClosed(drawerView);
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                // Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank

                super.onDrawerOpened(drawerView);
            }
        };

        //Setting the actionbarToggle to drawer layout
        drawerLayout.setDrawerListener(actionBarDrawerToggle);

        //calling sync state is necessay or else your hamburger icon wont show up
        actionBarDrawerToggle.syncState();







    }

toolbar.xmlにこれを使用する

<?xml version="1.0" encoding="utf-8"?>

    <Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:background="@color/colorPrimary"
        Android:elevation="4dp"
        Android:id="@+id/toolbar"
        Android:theme="@style/ThemeOverlay.AppCompat.Dark"


        >

    </Android.support.v7.widget.Toolbar>

使用したい場合はナビゲーションヘッダにこれを使用します

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="192dp"
    Android:background="?attr/colorPrimaryDark"
    Android:padding="16dp"
    Android:theme="@style/ThemeOverlay.AppCompat.Dark"
    Android:orientation="vertical"
    Android:gravity="bottom">
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="56dp"
        Android:id="@+id/navhead"
        Android:orientation="vertical"
        Android:layout_alignParentBottom="true"
        Android:layout_alignParentLeft="true"
        Android:layout_alignParentStart="true">

        <TextView
            Android:id="@+id/name"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_marginLeft="16dp"
            Android:textColor="#ffffff"
            Android:text="tanya"
            Android:textSize="14sp"
            Android:textStyle="bold"

            />

        <TextView
            Android:id="@+id/email"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:textColor="#ffffff"
            Android:layout_marginLeft="16dp"
            Android:layout_marginTop="5dp"
            Android:text="tanya.com"
            Android:textSize="14sp"
            Android:textStyle="normal"

            />
    </LinearLayout>
    <de.hdodenhof.circleimageview.CircleImageView
        Android:layout_width="70dp"
        Android:layout_height="70dp"
        Android:layout_below="@+id/imageView"
        Android:layout_marginTop="15dp"

        Android:src="@drawable/face"
        Android:id="@+id/circleView"
        />



</RelativeLayout>
1
Volverine

このコードをbaseactivityに更新してください。アクティビティxmlにdrawer_list_headerを含めることを忘れないでください。

super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.drawer_list_header);

そしてあなたの活動の中でrequest()を使わないでください。それでもまだ引き出しは、画像をクリックしても表示されません。ドラッグすると、リスト項目なしで表示されます。私はたくさん試したが成功しなかった。このためにいくつかのトレーニングが必要です...

1
M S Gadag

私はこのようにコトリンでそれをします:

open class BaseAppCompatActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

protected lateinit var drawerLayout: DrawerLayout
protected lateinit var navigationView: NavigationView
@Inject
lateinit var loginService: LoginService

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    Log.d("BaseAppCompatActivity", "onCreate()")
    App.getComponent().inject(this)
    drawerLayout = findViewById(R.id.drawer_layout) as DrawerLayout

    val toolbar = findViewById(R.id.toolbar) as Toolbar
    setSupportActionBar(toolbar)

    navigationView = findViewById(R.id.nav_view) as NavigationView
    navigationView.setNavigationItemSelectedListener(this)

    val toggle = ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)

    drawerLayout.addDrawerListener(toggle)
    toggle.syncState()
    toggle.isDrawerIndicatorEnabled = true

    val navigationViewHeaderView = navigationView.getHeaderView(0)
    navigationViewHeaderView.login_txt.text = SharedKey.username
}
private inline fun <reified T: Activity> launch():Boolean{
    if(this is T) return closeDrawer()
    val intent = Intent(applicationContext, T::class.Java)
    startActivity(intent)
    finish()
    return true
}

private fun closeDrawer(): Boolean {
    drawerLayout.closeDrawer(GravityCompat.START)
    return true
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
    val id = item.itemId

    when (id) {
        R.id.action_tasks -> {
            return launch<TasksActivity>()
        }
        R.id.action_contacts -> {
            return launch<ContactActivity>()
        }
        R.id.action_logout -> {
            createExitDialog(loginService, this)
        }
    }
    return false
}
}

DrawerのアクティビティはこのBaseAppCompatActivityを継承し、コンテンツが設定された後にsuper.onCreateを呼び出し(実際にはinitメソッドに移動することができます)、レイアウト内のidに対応する要素を持たなければなりません

1
Pavlus

私の答えは、ソースコードのない概念的なものです。私のような何人かの読者が理解することは役に立つかもしれません。

それはあなたがどのようにあなたのアプリを構築するかにあなたの最初のアプローチに依存します。基本的に2つの方法があります。

  1. 1つの活動(基本活動)を作成すると、他のすべてのビューと画面はフラグメントになります。その基本アクティビティには、引き出しレイアウトとコーディネータレイアウトの実装が含まれています。小さい自己完結型のフラグメントを使用するとアプリ開発がより簡単でスムーズになるため、これは実際には私の推奨するやり方です。

  2. 画面ごとに1つのアクティビティでアプリ開発を始めた場合は、おそらくベースアクティビティを作成し、それ以外のすべてのアクティビティはそれから拡張します。基本アクティビティには、引き出しおよびコーディネータ実装のためのコードが含まれます。引き出しの実装が必要な活動はすべて基本活動から拡張できます。

私は個人的には、いかなる組織化もせずに断片や活動を混在させることを避けたいと思います。それは開発をより困難にし、あなたを最終的に動けなくします。それが終わったら、あなたのコードをリファクタリングしてください。

1

@Kevin van Mierloの回答で、あなたはいくつかの引き出しを実装することもできます。たとえば、左側にあるデフォルトのメニュー(開始)、右側にあるその他のオプションのメニューで、確定フラグメントがロードされたときにのみ表示されます。

私はそれができました。

1
russellhoff