6

Ich bin Anfänger auf Android und ich entwickle kleine Android-Anwendung. In meiner Anwendung verwende ich die Sherlock-Bibliothek. Meine Anwendung enthält eine Hauptaktivität und zwei Fragmente. Auf meiner Strukturliste Fragment sieht aus wieonCreateOptionsMenu zuvor 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"); 

    } 

} 

Nun mein Problem ist, dass, wenn ich fro ein Fragment zu einem anderen Fragmente für erstes Mal einschalten es folgende Protokollausgabe

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 

dieser Option bedeuten, auf erstellen gibt aufgerufen vor onfragment create und on activity create. und es gibt auch zwei Warnungen. Dies funktioniert ohne Fehler. Aber ich bin nicht in der Lage zu meiner Liste Ansicht

nun angezeigt wird, wenn ich wieder zu gleichem Fragmente wechseln (zum zweiten Mal) es folgende Protokollausgabe gibt

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 

diesmal ist es keine Warnung geben und ordnungsgemäß funktioniert. Zeigt auch meine Listenansicht an. Aber zum ersten Mal funktioniert es nicht richtig .. Ein weiterer Punkt ist, dass wenn ich es auf höhere Version von Android lief es gut funktioniert. Aber wenn ich es auf der niedrigeren Version von Android wie 2.3.3 lief, zeige ich solches Verhalten. Ich lese darüber ListFragment onPrepareOptionsMenu called before onCreate. Why and How to Fix/Bypass? Aber ich bin nicht in der Lage, dieses Problem zu lösen.

wenn ich definieren setHasOptionsMenu(true) innerhalb onActivityCreated es folgende Ausgabe

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 

gibt, gebe ich auch versucht setHasOptionsMenu für mein Fragment zu setzen, wo tatsächliche Fragment Transaktion wie unten nimmt ..

@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(); 
      } 

und es immer noch gibt das gleiche Problem.

ein Problem mit meinem Code oder etwas anderes? So, wie man dieses Problem löst. Benötigen Sie Hilfe ... danke ...

+0

Sind Sie sicher, dass es nicht ist, weil Sie 'setHasOptionsMenu' aufrufen, bevor Sie onCreate anmelden? – Zharf

+0

Hi zarf Danke für die Antwort. sehe meine bearbeitete Frage .. und änderte Log-Ausgabe .. Aber das löst mein Problem nicht. – nilkash

Antwort

1

Ich weiß nicht, warum es so funktioniert, aber dies tun: Set Option setHasOptionsMenu(true) in Ihrer Aktivität, wenn Sie Ihr Fragment, um es hinzufügen.

Zum Beispiel:

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

f.setHasOptionsMenu(true); //here 

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

Und löschen Einstellung es im Code Ihres Fragments. Es hat für mich funktioniert.

+0

Hi michal danke für schnelle Antwort .. Ich habe versucht deine Lösung. In meiner Anwendung verwende ich Tabs. In meiner ontabselected Methode versuchte ich Ihre Lösung, aber es funktioniert nicht für mich. Ich habe folgendes versucht: "MyCards my_card = new MyCards()' und 'my_card.setHasOptionsMenu (true)' .... Aber es funktioniert nicht. Diese Methode funktioniert nicht einmal auf der neuesten Version von Android für mich. Jede andere Lösung. Danke für die Hilfe ... – nilkash

+0

Was meinst du mit dieser Methode nicht einmal funktioniert? Es funktioniert für mich auf Android 2.3 so gut wie auf 4.2. –

+0

hallo michal danke für die antwort. Ich habe es auf 2.3.3 und ics-Version versucht, aber es funktioniert nicht ... Ist etwas falsch mit meinem Code ... Brauchen Sie Hilfe. – nilkash

28

schreiben setHasOptionsMenu(true); in onActivityCreated(Bundle savedInstanceState) Methode.

+3

Dies sollte als richtige Antwort markiert werden. – Horacio

+0

Es funktioniert für mich! – JaredLuo

+3

Die Argumentation: Bei einigen Versionen erstellt die Support-Bibliothek beim Aufruf von setHasOptionsMenu sofort die Menüleiste (true) ... dies kann möglicherweise zu Fehlern führen, wenn Sie beispielsweise das Layout bereits aufgebläht haben oder einige Instanzvariablen aufgefüllt haben müssen vom überhöhten Layout. – chaqke