2013-03-01 101 views
0

我正在试验Android碎片,因此我创建了两个碎片ListFragmentDetailFragment。问题是,当我点击ListFragment并调用DetailFragment方法显示ListFragment中的选定项目时,DetailFragment上未显示任何结果。这里是DetailFragment代码:Android碎片

private static final String DETAIL_FRAG_TAG = "detail_fragment"; 
private Context appContext = null; 
private TextView lblItemDetail = null; 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // inflate the fragment layout 
    View rootView = inflater.inflate(R.layout.fragments_detail_fragment, container, false); 
    lblItemDetail = (TextView) rootView.findViewById(R.id.lbl_itemDetail); 


//at this point the TextView is not null===>see L0g.i 
Log.i(DETAIL_FRAG_TAG, " ---MyDetailFragment---oncreateView()--lblItemDetail =[" + lblItemDetail + "]"); 

    // get the fragment activity context 
    appContext = this.getActivity(); 
    return rootView; 
} 

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

} 

/** 
* show the details of the item selected on the listFragment. 
* @param itemDetail - the details of the item selected on ListFragment. 
*/ 
public void showLstItemDetail(String itemDetail) { 

    if (lblItemDetail != null) { 
     // the View to show Text should not be Null. 
     lblItemDetail.setText(itemDetail); 
    } 

    //at this point calling this method shows 
      that the `TextView` is Null yet it's 
     initialized in the 
     oncreate() as a class member variable ---why am i 
    getting Null after the `oncreate` is finished. 
    Log.i(DETAIL_FRAG_TAG, "------showItemDetail---------msg=[" + itemDetail + "] txt=[" + lblItemDetail + "]"); 
} 



//when I create an instance of `MYDetailFragment` and call the method to show the details of item Selected on the `DetailFragment` the `TextView` will be null. Why? 

    MYDetailFragment detailFrag = new MyDetailFragment(); 
    detailFrag.showLstItemDetail("Selected List Item"); 
+0

你能告诉我们如何以及何时你叫'MYDetailFragment detailFrag'?你可以c/p你所有的片段代码? – 2013-03-01 14:52:04

+0

您应该使用setArguments和getArguments将详细信息传递给片段。您正在调用detailFrag.showLstItemDetail(“Selected List Item”)的Currenlty; - >这个函数应该在片段本身中调用。为什么?因为那时片段ui尚未加载 – Tobrun 2013-03-01 15:11:28

回答

0
这两条线在

片段下面的教程:

MYDetailFragment detailFrag = new MyDetailFragment(); 
detailFrag.showLstItemDetail("Selected List Item"); 

onCreateView()当时尚未被称作。这意味着片段rootView永远不会被创建,并且TextView永远不会被创建!

只有在您使用片段事务后才能创建视图,将该片段放入布局中,然后片段将被附加到活动(onAttach()),并且在onCreateView()调用。只有这样才能设置任何东西。

将参数传递给片段的标准最佳做法是使用Bundle。看一个例子代码:

上的活动:

MYDetailFragment detailFrag = new MYDetailFragment(); 
Bundle b = new Bundle(); 
detailFrag.setArguments(b); 
b.putString("detail", value); 
// then proceed to the fragment transaction 

然后在您的片段:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
// inflate the fragment layout 
View rootView = inflater.inflate(R.layout.fragments_detail_fragment, container, false); 
lblItemDetail = (TextView) rootView.findViewById(R.id.lbl_itemDetail); 
Bundle b = getArguments(); 
lblItemDetail.setText(b.getString("details"));