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ę ...
Czy jesteś pewien, że to nie dlatego, że wywołujesz 'setHasOptionsMenu' przed wykonaniem logowania onCreate? – Zharf
Cześć zharf dziękuję za odpowiedź. zobacz moje edytowane pytanie .. i zmieniono wynik logu .. Ale to nie rozwiązuje mojego problemu .. – nilkash