C/C++ week November Black Friday
Black Friday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
Pouze tento týden sleva až 80 % na e-learning týkající se C/C++

Diskuze: NavigationView onNavigationItemSelected se nezavolá

Aktivity (3)
Avatar
tknette
Člen
Avatar
tknette:21. května 10:12

Ahoj, dělám svoji první appku a vytvořil jsem si NavigationView menu a teď bych chtěl přidat na položky listenery, aby to menu něco dělalo. Našel jsem si nějaký návod a z nějakého důvodu to nefunguje, ale ani nevyhazuje žádnou chybu a tak moc nevím co s tím. Vypadá to, že metoda onNavigationI­temSelected se vůbec nezavolá, protože log, který v ni mám se nezobrazí.

Zkusil jsem: Jak jsem postupoval:

1. Do mainActivity jsem implementoval OnNavigationI­temSelectedLis­tener

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

2. Nastavil listenery

val mNavigationView = findViewById<View>(R.id.nav_view) as NavigationView
            mNavigationView.setNavigationItemSelectedListener(this)

3. Přepsal metodu onNavigationI­temSelected

override fun onNavigationItemSelected(item: MenuItem): Boolean {
    Log.d(LOG_TAG, "hello there")
    return true
}

Vzhledem k tomu, že to nevyhazuje chybu, tak čekám, že to bude nějaká blbost, ale fakt netuším kde hledat chybu.

Předem děkuji za rady :)

Editováno 21. května 10:12
 
Odpovědět
21. května 10:12
Avatar
Odpovídá na tknette
Martin Donát:21. května 10:25

Ahoj, takhle se zdá, že jsi to udělal správně. Co mě napadá, že to navigation view s id R.id.nav_view musí být součástí layoutu, který nastavuješ v aktivitě v metodě onCreate skrze metodu setContentView.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}
 
Nahoru Odpovědět
21. května 10:25
Avatar
tknette
Člen
Avatar
Odpovídá na Martin Donát
tknette:21. května 10:38

Aha, už jsem na to přišel, mám to takhle:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main_with_nav)

    //start login action
    if(true){
        val intent = Intent(applicationContext, LoginActivity::class.java)
        startActivity(intent)
    }

    val mNavigationView = findViewById<View>(R.id.nav_view) as NavigationView
    mNavigationView.setNavigationItemSelectedListener(this)

a chyba je v té if podmínce, když tam dám false, tak sice přeskočím přihlašování, ale začne mi to fungovat. V opačném případě to z nějakého důvodu nereaguje, tušíš proč?

Jasně že if true nebo false je blbost, do budoucna tam bude asi nějaké ověření session,ale na testování to mám zatím takhle.

 
Nahoru Odpovědět
21. května 10:38
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na tknette
Martin Donát:21. května 10:49

No myslím si, že problém bude v tom, že spustíš v té podmínce úplně novou aktivitu. Pokud Login aktivita obsahuje ten samý layout jako Main aktivita, tedy R.layout.acti­vity_main_wit­h_nav, tak Login aktivita si musí též přiřadit setNavigationI­temSelectedLis­tener pro navigation view R.id.nav_view. Každá aktivita je samostatná jednotka s vlastním životním cyklem a nic si mezi sebou nesdílí. Až trochu pokročíš, tak zjistíš, že existují fragmenty, které se spouští v rámci aktivity a ty ti pomohou s tím, že společné věci může řešit jejich rodičovská aktivita, jako například tenhle listener pro hlavní menu. :-)

 
Nahoru Odpovědět
21. května 10:49
Avatar
tknette
Člen
Avatar
tknette:21. května 13:21

No, ta aktivita má právě jiný layout, proto jsem nečekal, že by to vadilo. Nakonec bylo řešení jednoduché, po přihlášení jsem volal následující kod abych se vrátil na main view:

activity.setContentView(R.layout.activity_main_with_nav);

a stačilo za to přidat:

activity.finish();

a už to funguje. Každopádně děkuju za pomoc :)

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
21. května 13:21
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.