2017-05-09 18 views
8

Chcę pokazać/ukryć niektóre opcje menu na aplikacji Android w zależności od niektórych ciągów, które ustawię na true/false w pliku strings.xml.Jak parametryzować opcje menu na urządzeniu z systemem Android?

Jako przykład, będę mieć te sznurki na strings.xml pliku:

<string name="option1">false</string> 
<string name="option2">true</string> 
<string name="option3">true</string> 

Więc w tym przypadku tylko option2 i option3 muszą być pokazane.

Z drugiej strony, to znaczy, w kodzie, próbowałem następujące:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

    getMenuInflater().inflate(R.menu.main, menu); 

    if((getResources().getString(R.string.option1)).equals("false")){ 
     menu.getItem(R.id.option1).setVisible(false); 
    } 

    return true; 
} 

Ale option1 wciąż jest pokazany w menu.

Co należy zrobić, aby sparametryzować te opcje? Mogę po prostu usunąć te opcje, ale chciałbym, aby w przyszłości, gdyby moi klienci chcieli ponownie aktywować te opcje, mógłbym to z łatwością zmienić wartość false na true.

EDIT: Oto moje menu:

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

    <group android:checkableBehavior="single"> 
     <item 
      android:id="@+id/option1" 
      android:title="Option 1" /> 
     <item 
      android:id="@+id/option2" 
      android:title="Option 2" /> 
     <item 
      android:id="@+id/option3" 
      android:title="Option 3" /> 
     .... 
    </group> 
</menu> 

LAST UPDATE

mam informuje, że byłem coraz NullPointerException ponieważ nazwa menu było źle. Naprawiłem to i teraz nie daje mi żadnego błędu.

Ale mój problem wynika z tego, że mam dwa różne układy, które zawierają dwa różne menu (jeden w każdym układzie) i nadmuchuję każdy układ w zależności od ciągu znaków, który pojawia się podczas logowania.

Na przykład, biorąc pod uwagę, że ciąg nadmuchać pierwszy układ jest „cześć” wyświetlać układy następująco na onCreate funkcji mojego MainActivity:

if("hello".equals(stringForLayout)){ 
    setContentView(R.layout.activity_main); 
}else{ 
    setContentView(R.layout.activity_main_secondary); 
} 

Jak mogę parametrize opcje obydwu menu tak jeśli pierwszy jest pokazywany i chcę ukryć jedną opcję, mógłbym odnieść się do tej opcji tego menu?

Z góry dziękuję!

+1

Jak powiedział użytkownik @3737999, lepiej wybrać standardowe rozwiązanie SharedPreferences. Następnie ustaw odpowiednio widoczność elementów menu. –

Odpowiedz

3

Wreszcie znalazłem, gdzie były moje problemy.

Problem wystąpił, ponieważ nie zauważyłem, że onCreateOptionsMenu i onPrepareOptionsMenu nie zostały użyte, więc je usunąłem.

Ponadto, jak używałem mojego menu wewnątrz NavigationView musiałem użyć, po nadmuchać NavigationView na moim onCreate funkcji mojego MainActivity klasy, następujące oświadczenie:

navigationView.getMenu().findItem(R.id.option1).setVisible(false); 

Nie, nie mam każdy problem, aby z powodzeniem ukryć mój element menu.

4

Jeśli używasz Strings (np s1 & S2), trzeba porównać je tak:

if (s1.equals (s2)) {...}

Btw .: MOŻESZ również spójrz na Shared Preferences w dokumentacji Android, aby uzyskać bardziej przejrzyste rozwiązanie. Tam możesz zdefiniować zmienne binarne dla różnych opcji menu.

+0

OMG! Nie mogę uwierzyć, że popełniłem ten błąd. Jakiś czas bez programowania w Javie i wróciłem do błędów początkujących :(Ale mam kolejną wątpliwość, kiedy próbuję uczynić menuOption widocznym dla false otrzymuję następujący błąd: 'java.lang.NullPointerException: Próba wywołania metody interfejsu ' android.view.MenuItem android.view'. Próbowałem zarówno z 'getItem' i' findItem', ale z oboma z nich otrzymuję ten sam błąd. Czy powinienem wykonać porównanie w innym miejscu? –

+0

czy możesz również opublikować xml z menu? – user3728999

+0

Dodałem xml z menu. –

0

Spróbuj tego, jeśli chcesz ukryć określony element menu dla określonej aktywności.

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuItem mSearch = menu.findItem(R.id.mSearch); 
     mSearch.setVisible(false); 
     invalidateOptionsMenu(); 
}