Soy bastante nuevo en Android y AndroidStudio, y tengo un problema con SwitchCompat. Necesito que esté en mi menú NavigationDrawer, y solo quiero verificar su valor isChecked. Después de algunos tutoriales, logré armar este código: este es mi SwitchCompat XML, drawer_switch.xml

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

Entonces tengo NavigationView en mi DrawerLayout activity_main.xml

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"

        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/nav_header"
        app:menu="@menu/drawer_menu" />

Y mi drawer_menu.xml con su SwitchCompat

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    tools:showIn="navigation_view">
    <item android:title="Sondaggi"
        android:id="@+id/menuSondaggi">
        <menu>
            <item
                android:id="@+id/set_votato"
                android:icon="@drawable/ic_set_votato"
                android:title="Mostra già votati"
                app:actionLayout="@layout/drawer_switch" />
                [...]
         </menu>
    </item>
</menu>

Ahora, en mi MainActivity, en OnCreate, estoy tratando de obtener SwitchCompat para verificar su isChecked:

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

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        try {
            MenuItem item = (MenuItem) navigationView.getMenu().findItem(R.id.set_votato);
            SwitchCompat votatoSwitch = (SwitchCompat) item;
            votatoSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    votato=isChecked;
                }
            });
        }catch (Exception e){
            e.getCause();
        }
        [...]
    }

Pero se atasca cuando intenta lanzar un elemento a un SwitchCompat, diciendo java.lang.ClassCastException: android.support.v7.view.menu.MenuItemImpl cannot be cast to android.support.v7.widget.SwitchCompat. El hecho es que si depuro, puedo ver que el elemento sabe que es un SwitchCompat, como puede ver en la imagen: Captura de pantalla de depuración

¿Dónde está mi error? Que tú de antemano.

1
Angelo 5 feb. 2019 a las 18:22

2 respuestas

La mejor respuesta

item es un elemento de menú. La clase View no amplía la clase MenuItem, por lo que no puede convertirla en una View.

Creo que quieres MenuItem # getActionView () método. Esto devuelve el diseño inflado que configuró en android:actionLayout.

SwitchCompat votatoSwitch = (SwitchCompat) item.getActionView();
1
TheWanderer 5 feb. 2019 a las 15:26

El set_votato es un MenuItem. Deberías probar item.getActionView() y enviarlo a un switchCompat.

1
Mike 5 feb. 2019 a las 15:35