在我的开发者控制台上,我遇到了一些错误。关于这个错误的一件事是它们都来自具有android 4.1
版本的设备。
编辑:4.2设备上的一些错误但仍无法重现确切的行为。
我已经设置了一个带有Android版本4.1
的模拟器设备,并且在重新调试时我发现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()
所需的一切{1}}致电onCreateOptionsMenu
。这使得bDFav.open();
位于isItemFavorite()
,并且按预期工作,也就是说,它不会产生nullpointerexception
。
另一方面,在运行android 4.1.1的模拟器设备上,它在transaction.commit();
运行相同但在那之后,我的方法onCreateView
没有被调用,因此没有实例化任何东西。在onCreateOptionsMenu
被调用时,isItemFavorite()
被称为广告,它会在nullpointerexception
生成bDFav.open();
。
为什么在该Android版本中没有调用onCreateView
,我该如何绕过它?
答案 0 :(得分: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
,因为在该方法中我调用另一个应该使用应该在{{1}中实例化的东西的方法,应用程序崩溃。
我的解决方案是将onCreateView
放在setHasOptionsMenu(true);
的末尾,这样就可以正确完成所有实例化。
有一件事很有趣。为什么它在某些设备和其他设备上有效。