web-dev-qa-db-ja.com

デザインサポートライブラリをオンにしてナビゲーションドロワーアイテムを切り替えますAndroid

Switchをナビゲーションドロワーのアイテムの中に入れる必要があります。新しいデザインサポートライブラリを使用していますが、それが可能かどうかまったくわかりません。使用する場合

Android:checkable

アイテムは完全に選択されているだけで、それは私が望むものではありません。

これは私が本当に欲しいもののスクリーンショットです。それを達成することは可能ですか?

enter image description here

11
Marcin Lagowski

ナビゲーションドロワーのメニュー項目:

<item
    Android:id="@+id/nav_item1"
    Android:icon="@drawable/ic_item1"
    Android:title="item1"
    app:actionLayout="@layout/layout_switch"
    />

およびそのアイテムのレイアウト:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="horizontal" Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Android.support.v7.widget.SwitchCompat
        Android:id="@+id/drawer_switch"
        Android:layout_width="fill_parent"
        Android:layout_height="match_parent"
        Android:text=""/>

</LinearLayout>
24
lenooh

これを行う方法の1つは、必要なmenuItemでsetActionViewを使用することです。

mNavigationView.getMenu().findItem(R.id.nav_connect)
        .setActionView(new Switch(this));

// To set whether switch is on/off use:
((Switch) mNavigationView.getMenu().findItem(R.id.nav_connect).getActionView()).setChecked(true);

おそらく、クリックリスナーもスイッチの状態を変更する必要があります。

mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(MenuItem menuItem) {

        switch (menuItem.getItemId()) {
            case R.id.nav_connect:
                ((Switch) menuItem.getActionView()).toggle();
                return true;
        }
    }
}

私は試していませんが、おそらくxmlでAndroid:actionLayout = "@ layout/switch_layout"を使用して、作成したカスタムレイアウトを指すことができます。

また、もう少し堅牢性を提供する可能性のあるActionProviderを使用してみることもできます。私もこの方法を試していません。

13
bmhoncho

答えはどれも完全ではないようですので、ここでさらに調査した後、私が思いついたのは次のとおりです。

drawer_switch.xml:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.SwitchCompat 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/drawer_switch"
    Android:layout_width="fill_parent"
    Android:layout_height="match_parent" />

drawer_menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">

    <item Android:title="@string/header">
        <menu>
            <item
                Android:id="@+id/switch_item"
                Android:icon="@drawable/ic_switch_item"
                app:actionLayout="@layout/drawer_switch"
                Android:title="@string/switch_item" />
        </menu>
    </item>
</menu>

DrawerActivity.Java:

SwitchCompat drawerSwitch = (SwitchCompat) navigationView.getMenu().findItem(R.id.switch_item).getActionView();
drawerSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    // do stuff
                } else {
                    // do other stuff
                }
            }
});

DrawerActivity.Java:

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {

    int id = item.getItemId();

    if (id == R.id.switch_item) {
        return false;
    }

    closeDrawer();
    return true;
}
11
Sir Codesalot

私はこのようなことをしました。

navigationView.getMenu().findItem(R.id.vibrate)
            .setActionView(new Switch(this));

    Switch vibrateSwitch =(Switch) 
navigationView.getMenu().findItem(R.id.vibrate).getActionView();
    vibrateSwitch.setChecked(true);
    vibrateSwitch.setOnCheckedChangeListener(new 
CompoundButton.OnCheckedChangeListener(){
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean 
isChecked){
                SharedPreferences sharedPreferences = 
getSharedPreferences(getString(R.string.MyPREFERENCES), MODE_PRIVATE);
                SharedPreferences.Editor editor = sharedPreferences.edit();
                editor.putBoolean(getString(R.string.VIBRATE), isChecked);
                editor.commit();
        }

    });
3
Arun

はい、これは簡単に実行できます。実装できるようにコードを投稿します

<item Android:id="@+id/nav_item_1"
        Android:title="Android"
        Android:icon="@drawable/ic_Android_black_24dp"
        Android:checked="true"/>

メインアクティビティのレイアウトは次のようになります。

<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"
tools:context=".MainActivity">

<LinearLayout
    Android:id="@+id/main_content"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical">

    <Android.support.v7.widget.Toolbar
        Android:id="@+id/app_bar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:background="@color/colorPrimary"
        Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

    <TextView
        Android:id="@+id/content_text"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"
        Android:layout_marginTop="50dp"
        Android:text="Your Content Goes Here"
        Android:textAppearance="?android:attr/textAppearanceLarge"
        Android:textColor="@color/colorAccent" />

    <!-- your content layout -->

</LinearLayout>

<Android.support.design.widget.NavigationView
    Android:id="@+id/menu_drawer"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    app:headerLayout="@layout/drawer_header"
    app:menu="@menu/menu_drawer" />

そして、これがステップバイステップです デザインライブラリを使用したナビゲーションドロワーのチュートリアル

1
Fareed

あなたはできるはずです。

ナビゲーションドロワービューはLinearLayoutにすることができ、その中にNavigationViewと別のViewGroupを追加してスイッチを含めることができます。