Android: получить действие кнопки переключения вместо выбранного элемента навигации - PullRequest
1 голос
/ 16 апреля 2020

У меня есть две функции A, B, когда пользователь изменит значение данной кнопки переключателя, будут выполнены A или B.

Моя проблема: действия A, B выполняются только тогда, когда элемент выбран, но не при изменении значения кнопки переключателя.

Я пытался получить доступ к кнопке переключателя из функции onCreate, но получаю NullPointerException.

мой код макета:

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



    <group android:checkableBehavior="single">
        <item
            android:id="@+id/switch_status"
            android:title="Go offline"
            android:checkable="true"
            app:actionViewClass="android.widget.Switch"
            />
        <item
            android:id="@+id/nav_profile"
            android:icon="@drawable/ic_action_profile"
            android:title="My Profile" />
        <item
            android:id="@+id/nav_broadcast"
            android:icon="@drawable/ic_action_broadcast"
            android:title="My groups" />

        <item
            android:id="@+id/nav_settings"
            android:icon="@drawable/ic_action_setting"
            android:title="Settings" />
        <item
            android:id="@+id/nav_logout"
            android:title="Logout" />
    </group>

</menu>

код моей активности:

publi c класс MainActivity расширяет AppCompatActivity, реализует NavigationView.OnNavigationItemSelectedListener, IUserClickListener {

    @Override
protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
        Utility.updateTheme(this);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(this, getFragmentManager());
        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position) {
                Fragment f = ((SectionsPagerAdapter) mViewPager.getAdapter()).getFragment(position);
                if ((position == 0 || position == 1) && f != null) {
                    f.onResume();
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {
            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                super.onDrawerSlide(drawerView, slideOffset);
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                updateMyInfo();
            }
        };
        drawer.setDrawerListener(toggle);
        toggle.syncState();
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setItemTextColor(new ColorStateList(state, color));
        navigationView.setNavigationItemSelectedListener(this);

// Exception here

final Switch sw = (Switch) menu.findItem(R.id.switch_status);
        sw.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (sw.isChecked()) {
Action A;
}
else {Action B;}
        }

}        

        @Override
            public boolean onNavigationItemSelected(MenuItem item) {
            // Handle navigation view item clicks here.
            int id = item.getItemId();
            if (id == R.id.switch_status) {
                Switch sw = (Switch) findViewById(R.id.switch_status);
                if (sw.isChecked()) {
                    Action A
                } else {

                 Action B
            }    
    }
    }

Как изменить код для выполнения действия при нажатии кнопки переключения нажал?

Спасибо

1 Ответ

1 голос
/ 16 апреля 2020

Когда вызывается onCreate действия, меню параметров еще не раздуто. Вот почему findViewById не может найти ваш Switch.

Добавьте это к своей деятельности:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main_drawer, menu);
    final Switch sw = (Switch) findViewById(R.id.switch_status);
    sw.setOnClickListener(new View.OnClickListener() {
        @Override
            public void onClick(View v) {
                // do something
            }
    });
    return true;
}

onCreateOptionsMenu вызывается, когда создается меню опций, после надувания ваше меню, вы можете получить доступ к Switch как обычно.

...