没有调用Android onCreateView

时间:2014-02-27 11:45:17

标签: android

在我的开发者控制台上,我遇到了一些错误。关于这个错误的一件事是它们都来自具有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,我该如何绕过它?

1 个答案:

答案 0 :(得分:0)

好。

我相信我已经找到了答案。

在方法中:

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

onCreateViewsetHasOptionMenu(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);的末尾,这样就可以正确完成所有实例化。

有一件事很有趣。为什么它在某些设备和其他设备上有效。