FragmentManager异步

时间:2014-07-17 15:23:56

标签: android fragment

我的项目在Eclipse中运行良好,但是由于我将项目迁移到AndroidStudio,我得到了这个奇怪的NullPointerException,我无法弄清楚它有什么问题。具体而言fragment.getView()无论出于何种原因总是返回null

public class MainActivity extends FragmentActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        selectItem(0);
    }
}

private void selectItem(int position) {
    // update the main content by replacing fragments
    Fragment fragment;
    switch(position) {
        case 0:
            fragment = new Fragment1();
            break;
        default:
            fragment = new Fragment1();
    }

    switchFragment(fragment, position);
}

private void switchFragment(Fragment fragment, int position){
    FragmentManager fm = getSupportFragmentManager();
    fm.beginTransaction()
            .replace(R.id.fragmentContainer, fragment)
            .commit();
    fragment.getView().setFocusableInTouchMode(true);
}

问题出在fragment.getView().setFocusableInTouchMode(true)行。我认为当FragmentManager提交fragment时,应该创建它的视图,但显然我错了。我试着查一查,但找不到任何令人满意的解释。请帮我解决这个问题。以下是我的Fragment1课程:

public class Fragment1 extends Fragment {

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
} 

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){
    return inflater.inflate(R.layout.activity_fragment1, parent, false);
}


}

1 个答案:

答案 0 :(得分:1)

片段事务以异步方式执行。可以把它想象成发布到UI线程消息队列的可运行文件。

特别是,getView()将返回从onCreateView()返回的任何内容,但仅在调用生命周期方法之后。在它返回null之前。

您应该将视图自定义(例如setFocusableInTouchMode())放入片段本身。 onCreateView()onViewCreated()是个好地方。

与Android Studio无关。它在两个IDE中的工作方式相同。