2010-11-12 17 views
15

Próbuję wywołać funkcję startActivity (myIntent) po kliknięciu przycisku menu, ale moja aplikacja ulega awarii w tym momencie.Jak wywołać aktywność z elementu menu w systemie Android?

Ta sama funkcja startActivity działa dobrze po zwykłym kliknięciu przycisku, więc zakładam, że w przycisku menu brakuje informacji o kontekście? A może jestem tu całkowicie nie na miejscu.

Więc ... jaki jest właściwy sposób, aby pozycja w menu zabrała mnie do określonego działania?

Zrewidowałem mój kod na podstawie wstępnego zestawu porad. Wciąż się zawiesza w tym samym miejscu. Debugger nie wchodzi w klauzulę wyjątku, aplikacja po prostu umiera.

[edytowane za pomocą fragmentu kodu]

public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu, menu); 
    return true; 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle item selection 
    try{ 
    switch (item.getItemId()) { 
    case R.id.menuItemLang:    
     startActivity(new Intent("com.my.project.SETTINGS")); 
     return true;   
    default: 
     return super.onOptionsItemSelected(item); 
    } 
    }catch(Exception e){ 
     log(e); 
    } 
} 
+1

Proszę zaksięgować pełny stacktr as z powodu awarii i fragment kodu, w jaki sposób rozpoczynasz działanie. –

+0

Będziesz musiał opublikować swój kod i ślad stosu – Falmarri

+0

powinieneś użyć logcat, aby wyświetlić ślad stosu. Jeśli używasz Zaćmienie, możesz przełączyć na perspektywę DDDS lub otworzyć widok logcat. W przeciwnym razie uruchom adb logcat z wiersza poleceń. –

Odpowiedz

43

Pierwsza opcja

Trzeba zastąpić onOptionsItemSelected metodę w swojej działalności, które nazywa się, gdy użytkownik kliknie na pozycji w menu Options. W tej metodzie możesz sprawdzić, który element został kliknięty.

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()) { 
    case R.id.menu_item1: 
     Intent intent = new Intent(this, ActivityForItemOne.class); 
     this.startActivity(intent); 
     break; 
    case R.id.menu_item2: 
     // another startActivity, this is for item with id "menu_item2" 
     break; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 

    return true; 
} 

Istnieje również onContextItemSelected metoda ta działa podobnie, ale z menu kontekstowego (nie jestem pewien, co masz na myśli menu).

Więcej informacji na http://developer.android.com/guide/topics/ui/menus.html

EDIT:

Druga opcja

Myślę, że pierwsza opcja jest łatwiej, ale z kodu widzę, że chcesz rozpocząć działalność jako działanie (z powodu parametru String w konstruktorze Intent). Aby to zrobić, musisz określić akcję w swoim AndroidManifest.xml. Tak więc, jeśli chciałbym rozpocząć działalność ActivityForItemOne (od poprzedniego przykładu) element w AndroidManifest.xml <application> będzie wyglądać następująco:

<application ...> 
    ... 

    <activity android:label="Activity For First Item" android:name=".ActivityForItemOne"> 
     <intent-filter> 
      <action android:name="my.app.ITEMONE" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 
</application> 

A Intent będą:

Intent intent = new Intent("my.app.ITEMONE"); 

my.app. jest pakiet Twoje zgłoszenie. Nie jest konieczne korzystanie z pakietu aplikacji, ale jest zalecane dla wyjątkowości działań.

Więcej informacji na:

Class Intent - Action and Category constants

Action element

Intents and Intent Filters

nadzieję, że to rozwiąże problem.

+0

EDYCJA: Druga opcja, rozpoczęcie działania według nazwy akcji. – branoholy

1

Więcej optimice:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.item1: 
      return true; 
     case R.id.item2: 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 
0

jeśli ma mieć 2 Klasa 1 główną działalność 2 Witamy to trzeba iść z mile widziani> główną działalność

@Override publicznego onCreateOptionsMenu (MENU) logiczna {

return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()) { 
     case R.id.logout: 
      Intent intent = new Intent(this, MainActivity.class); 
      this.startActivity(intent); 
      break; 
     case R.id.settings: 
      // another startActivity, this is for item with id "menu_item2" 
      break; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 

    return true; 
} 
Powiązane problemy