片段实例为null

时间:2014-07-01 06:22:32

标签: android fragment

我正在尝试通过编程添加片段,然后调用其中一个方法。在调用任何片段项时,我得到空指针异常。

    Fragment fragment = new HomeFragment();
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.frame_inner_container, fragment).commit();
((HomeFragment) fragment).homeSelected(true);

然后在Fragment中

public void homeSelected(boolean val) {

        if (val) {
            homeButton.setBackgroundColor(getResources().getColor(R.color.header_bg));
        } else {
            homeButton.setBackgroundColor(getResources().getColor(R.color.screen_bg));
        }
    }

homeButton始终为null。我检查了一下,发现在这个方法之后调用onActivityCreated。任何解决这个问题的方法。

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_home, container, false);
        listView = (ListView) v.findViewById(R.id.list_view);
        homeButton = (Button) v.findViewById(R.id.menu_btn_home);

        return v;
    }

2 个答案:

答案 0 :(得分:0)

您需要致电executePendingTransactions ()才能立即执行。

  

提交FragmentTransaction后   FragmentTransaction.commit(),它被安排执行   在进程的主线程上异步。如果你想   立即执行任何此类待处理操作,您可以调用它   函数(仅从主线程)这样做。请注意所有回调   和其他相关的行为将在这个电话中完成,所以   小心从哪里调用它。返回

Returns true if there were any pending transactions to be executed.

答案 1 :(得分:0)

在创建视图homeSelected之前,您可能正在调用方法R.layout.fragment_home

首先在活动中进行此调用 -

  Fragment fragment = new HomeFragment();
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction().
    replace(R.id.frame_inner_container, fragment).commit();

然后在片段中,首先调用onAttach()

@Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        //attach your activity here

}

然后你可以打电话,

@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
    super.onActivityResult(reqCode, resultCode, data);

     /*Somewhere here*/
    ((HomeFragment) fragment).homeSelected(true);

}