6

Sono principiante ad Android e sto sviluppando una piccola applicazione Android. Nella mia applicazione sto usando la libreria Sherlock. La mia applicazione contiene un'attività principale e due frammenti. Su della mia lista struttura frammento sembraonCreateOptionsMenu chiamato prima 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"); 

    } 

} 

Ora il mio problema è che quando passo a fro un frammento all'altro frammento per la prima volta dà seguente output di registro

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 

dire il creare opzione chiamato prima di creare e creare attività onfragment. e anche dando due avvertimenti. Questo lavoro senza alcun errore. Ma io non sono in grado di visualizzare la mia lista vista

Ora, quando ho di nuovo passare a stesso frammento (per la seconda volta) dà output seguente registro

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 

questa volta non sta dando alcun avvertimento e funziona correttamente. Mostra anche la mia vista elenco. Ma per la prima volta non funziona correttamente .. Un altro punto è che quando l'ho eseguito su una versione superiore di Android funziona bene. Ma se l'ho eseguito su versione inferiore di Android come 2.3.3 ho mostrato un tale comportamento .. Ho letto su questo ListFragment onPrepareOptionsMenu called before onCreate. Why and How to Fix/Bypass? Ma non sono in grado di risolvere questo problema.

se io definisco setHasOptionsMenu(true) all'interno onActivityCreated dà seguente output

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 

Ho anche provato a impostare setHasOptionsMenu per il mio frammento in cui effettiva transazione frammento avviene come seguente ..

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

e ancora dando lo stesso problema.

qualsiasi problema con il mio codice o qualche altra cosa? Quindi, come risolvere questo problema. Hai bisogno di aiuto ... grazie ...

+0

Sei sicuro che non lo sia perché stai chiamando 'setHasOptionsMenu' prima di fare il login suCreate? – Zharf

+0

Ciao zharf grazie per la risposta. vedi la mia domanda modificata .. e modifica l'output del registro .. Ma questo non risolve il mio problema .. – nilkash

risposta

1

Non so perché funziona così, ma fare questo: opzione Imposta setHasOptionsMenu(true) nella vostra attività quando si aggiunge il vostro frammento ad esso.

Ad esempio:

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

f.setHasOptionsMenu(true); //here 

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

e cancellare l'impostazione nel codice del frammento. Ha funzionato per me.

+0

Ciao michal grazie per la rapida risposta .. Ho provato u r soluzione. Nella mia applicazione sto usando le schede. Nel mio metodo on-touch ho provato la tua soluzione ma non funziona per me. Ho provato nel modo seguente. 'MyCards my_card = new MyCards()' e 'my_card.setHasOptionsMenu (true)' .... Ma non funziona. Questo metodo non funziona nemmeno sull'ultima versione di Android per me. Qualsiasi altra soluzione Grazie per l'aiuto ... – nilkash

+0

Cosa intendi con questo metodo non funziona nemmeno? Sta funzionando per me su Android 2.3 fino alla 4.2. –

+0

Ciao michal grazie per la risposta. Ho provato su 2.3.3 e versione di ics ma non funziona ... C'è qualcosa di sbagliato nel mio codice ... Ho bisogno di aiuto. – nilkash

28

scrivere setHasOptionsMenu(true); nel metodo onActivityCreated(Bundle savedInstanceState).

+3

Questo dovrebbe essere contrassegnato come risposta corretta. – Horacio

+0

Funziona per me! – JaredLuo

+3

il ragionamento: per alcune versioni, la libreria di supporto creerà immediatamente la barra dei menu sulla chiamata setHasOptionsMenu (true) ... questo potrebbe causare errori se, ad esempio, è necessario che il layout sia già gonfiato o che siano necessarie alcune variabili di istanza dal layout gonfiato. – chaqke

Problemi correlati