6

Jestem początkujący dla Androida i rozwijam małą aplikację na Androida. W mojej aplikacji korzystam z biblioteki Sherlock. Moja aplikacja zawiera jedno główne działanie i dwa fragmenty. Na mojej liście struktury fragmentu wyglądaonCreateOptionsMenu wywoływane przed onCreate android

public class MyCards extends SherlockListFragment 
     { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setHasOptionsMenu(true); 
     Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside fragment on create"); 

    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on activity created"); 
    } 

    private void displayCards(int type) { 

     Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside display cards"); 

    } 

    @Override 
    public void onResume() { 
     super.onResume(); 

    } 

    @Override 
    public void onPause() { 
     super.onPause(); 

    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.mycards, container, false); 

     View view1 = inflater.inflate(R.layout.empty_card, container, false); 
     return view; 

    } 

    /*@Override 
    public void onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 

    optionsMenu = menu; 
    }*/ 

    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     inflater.inflate(R.menu.menu_type2, menu); 

     Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on create option menu"); 
     Spinner spinner = (Spinner) menu.findItem(R.id.cardType) 
       .getActionView(); 

     SpinnerAdapter adapter = ArrayAdapter.createFromResource(getSherlockActivity().getSupportActionBar().getThemedContext(), R.array.card_action_list,android.R.layout.simple_spinner_dropdown_item); 
     spinner.setAdapter(adapter); // set the adapter 

     spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 

      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, 
        int pos, long id) { 
       displayCards(pos); 
       Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on option selected"); 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> arg0) { 
       displayCards(0); 
       Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on no option selection"); 
      } 

     }); 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside option select listener"); 

    } 

} 

Teraz moim problemem jest to, że po zmianie fro jednego fragmentu do innego fragmentu po raz pierwszy daje następujące dane wyjściowe dziennika

01-04 00:54:06.997: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(2575): inside on create option menu 
01-04 00:54:06.997: W/KeyCharacterMap(2575): No keyboard for id -1 
01-04 00:54:06.997: W/KeyCharacterMap(2575): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 
01-04 00:54:07.020: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(2575): inside fragment on create 
01-04 00:54:07.036: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(2575): inside on activity created 

to znaczy, że na tworzenie opcji wywoływane przed utworzeniem i utworzeniem działania. a także daje dwa ostrzeżenia. To działa bez żadnego błędu. Ale nie jestem w stanie wyświetlić mojego widoku listy

Teraz kiedy znowu przełączyć się na tym samym fragmencie (po raz drugi) daje następujące dane wyjściowe dziennika

02-07 10:05:10.983: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside on create option menu 
02-07 10:05:11.023: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside fragment on create 
02-07 10:05:11.043: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside on activity created 
02-07 10:05:11.113: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside display cards 
02-07 10:05:11.133: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside on option selected 

tym razem nie dając żadnego ostrzeżenia i działa prawidłowo. Wyświetla również mój widok listy. Ale po raz pierwszy nie działa prawidłowo. Kolejnym punktem jest to, że gdy uruchomiłem go na wyższej wersji Androida, działa dobrze. Ale jeśli uruchomiłem go na niższej wersji Androida, takich jak 2.3.3 i pokazuje takie zachowanie .. Czytałem o tym ListFragment onPrepareOptionsMenu called before onCreate. Why and How to Fix/Bypass? Ale nie jestem w stanie rozwiązać ten problem.

gdybym określić setHasOptionsMenu(true) wewnątrz onActivityCreated daje następujący wynik

01-04 03:32:38.622: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8157): inside fragment on create 
01-04 03:32:38.653: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8157): inside on activity created 
01-04 03:32:38.692: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8157): inside on create option menu 
01-04 03:32:38.700: W/KeyCharacterMap(8157): No keyboard for id -1 
01-04 03:32:38.700: W/KeyCharacterMap(8157): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 

Próbowałem też ustawić setHasOptionsMenu dla mojego fragmentu, w którym rzeczywista transakcja odbywa się fragment jak poniżej ..

@Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      MyCards mc = new MyCards(); 
      mc.setHasOptionsMenu(true); 
      ft = mActivity.getSupportFragmentManager().beginTransaction(); 

       mFragment = Fragment.instantiate(mActivity, mClass.getName(), 
         mArgs); 

       ft.add(android.R.id.content, mFragment, mTag); 
       ft.commit(); 
      } 

i nadal go dając ten sam problem.

jakiś problem z moim kodem lub coś innego? Jak rozwiązać ten problem. Potrzebujesz pomocy ... dziękuję ...

+0

Czy jesteś pewien, że to nie dlatego, że wywołujesz 'setHasOptionsMenu' przed wykonaniem logowania onCreate? – Zharf

+0

Cześć zharf dziękuję za odpowiedź. zobacz moje edytowane pytanie .. i zmieniono wynik logu .. Ale to nie rozwiązuje mojego problemu .. – nilkash

Odpowiedz

1

Nie wiem, dlaczego to działa tak, ale to zrobić: zestaw opcji setHasOptionsMenu(true) w swojej działalności podczas dodawania fragment do niego.

Na przykład:

//Activity class 
YourListFragment f = new YourListFragment(); 

f.setHasOptionsMenu(true); //here 

getSupportFragmentManager().beginTransaction() 
.add(R.id.your_list_fragment_container, f).commit(); 

i usuwać ustawienie go w kodzie fragment jest. To zadziałało dla mnie.

+0

Cześć michal dziękuję za szybką odpowiedź .. Próbowałem rozwiązanie u. W mojej aplikacji używam kart. W mojej wybranej przeze mnie metodzie wypróbowałem Twoje rozwiązanie, ale nie działa ono dla mnie. Próbowałem w następujący sposób. 'MyCards my_card = new MyCards()' i 'my_card.setHasOptionsMenu (true)' .... Ale nie działa. Ta metoda nie działa nawet dla najnowszej wersji Androida. Każde inne rozwiązanie. Dziękuję za pomoc ... – nilkash

+0

Co masz na myśli, że ta metoda nie działa? Działa dla mnie na Androidzie 2.3 tak dobrze, jak na 4.2. –

+0

cześć michal dziękuję za odpowiedź. Próbowałem go w wersji 2.3.3 i ics, ale to nie działa ... Czy jest coś nie tak z moim kodem ... Potrzebujesz pomocy. – nilkash

28

Napisz setHasOptionsMenu(true); w metodzie onActivityCreated(Bundle savedInstanceState).

+3

To powinno być oznaczone jako poprawna odpowiedź. – Horacio

+0

To działa dla mnie! – JaredLuo

+3

Rozumowanie: w przypadku niektórych wersji biblioteka pomocnicza natychmiast utworzy pasek menu wywołujący setHasOptionsMenu (true) ... może to spowodować błędy, jeśli na przykład potrzebny jest już zawyżony układ lub potrzeba niektórych zmiennych instancji z zawyżonego układu. – chaqke