2014-02-27 1 views
0

На моей консоли разработчика я получаю некоторые ошибки. Одна вещь об этих ошибках заключается в том, что все они с устройств с версией android 4.1.Android onCreateView не называется

РЕДАКТИРОВАТЬ: Некоторые ошибки на 4.2 устройствах, но по-прежнему не могут воспроизвести точное поведение.

Я установил эмулятор устройства с версией Android 4.1 и с debbuging Я обнаружил, что onCreateView он не вызывается.

Я использую фрагменты. У меня есть класс для обработки фрагментов (public class Fragments extends ActionBarActivity implements QueryFragment.OnQuerySelectedListener) и после того, как он проверяет, если мы на две панели или одного макета панели класс делает это:

@Override 
public void onItemSelected(Bundle itemSelectedData) { 

    View rightLayout = findViewById(R.id.fragment_two); 

    if (rightLayout != null) { 
     // do something if we are in "tablet" mode 
    } else { 
     Infodata newFragment = new Infodata(); 
     newFragment.setArguments(itemSelectedData); 
     FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
     transaction.replace(R.id.fragmentsboth, newFragment); 
     // Commit the transaction 
     transaction.commit(); 
    } 
} 

и мой класс Infodata

public class Infodata extends Fragment implements OnSeekBarChangeListener, OnItemSelectedListener 

Этот класс в этом методы:

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

//... more stuff 
    activityContext = getActivity().getApplicationContext(); 
    bDFav = new Database(activityContext, true); 
//... more stuff 
} 

и

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

    if (isItemFavorite()) { 
     //... do something 
    } else { 
     //... do something else 
    } 
} 

и, наконец:

boolean isItemFavorite() { 
    bDFav.open(); 
    // do stuff 
    bDFav.close(); 

    return isFavorite; 
} 

С моим телефоном (Android версия 4.2.1) мой Fragments класс делает Infodata newFragment = new Infodata(); и после transaction.commit(); моего onCreateView называется инстанцированием все, что необходимо для isItemFavorite() вызова на onCreateOptionsMenu. Это делает bDFav.open(); по адресу isItemFavorite() и работает, как ожидалось, то есть не производит nullpointerexception.

С другой стороны, с эмулятором, работающим под управлением Android 4.1.1, он работает так же на transaction.commit();, но после этого мой метод onCreateView не вызывается и, таким образом, не создает ничего. onCreateOptionsMenu называется ad там, когда вызывается isItemFavorite(), он производит nullpointerexception по адресу bDFav.open();.

Почему не onCreateView вызывается в этой версии для Android и как я могу обойти это?

ответ

0

Хорошо.

Я считаю, что нашел ответ.

В методе:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
//... more stuff 
    activityContext = getActivity().getApplicationContext(); 
    bDFav = new Database(activityContext, true); 
//... more stuff 
} 

Сразу же после onCreateView я имел setHasOptionMenu(true) поэтому метод был

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
setHasOptionsMenu(true); 
//... more stuff 
    activityContext = getActivity().getApplicationContext(); 
    bDFav = new Database(activityContext, true); 
//... more stuff 
} 

Так что, когда setHasOptionsMenu(true); называется управление программой переходит к onCreateOptionsMenu и так, что метод Я делаю вызов другому методу, который должен использовать то, что должно было быть создано в onCreateView, приложение аварийно завершает работу.

Моим решением было положить setHasOptionsMenu(true); в конце onCreateView, таким образом, все экземпляры были выполнены правильно.

Одна вещь интригующая, хотя. Почему он работал на некоторых устройствах, а на других - нет.

Смежные вопросы