Java týden Java týden
Pouze tento týden sleva až 80 % na celý Java e-learning!
Brno? Vypsali jsme pro vás nové termíny školení OOP v Brně!
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  +1 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
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  +1 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.