2012-07-31 100 views
17

我有做一个片段交易安卓碎片无法获得活动

DetailFragment newFragment = new DetailFragment(); 
transaction.replace(R.id.mylist, newFragment); 
transaction.addToBackStack(null); 
transaction.commit(); 

工作正常的活动。现在我知道在我的活动中,我需要在newFragment中的布局中替换动态字符串。我以为我能器transaction.commit后调用()只是像

newFragment.setMyString("my dynamic value"); 

而在newFragment.java我

public void setMyString(String s) 
{ 
TextView tv = (TextView) getActivity().findViewById(R.id.myobject); 
tv.setText(s); 
} 

的一点是,getActivity()返回null。我如何获得我需要的环境来查找我的布局元素?

编辑:

我尽量按照使用捆绑的路线,因为这似乎是最彻底的方法。所以我改变了我的代码:

Bundle b = new Bundle(); 
b.putString("text", "my dynamic Text"); 
DetailFragment newFragment = new DetailFragment(); 
transaction.replace(R.id.mylist, newFragment); 
transaction.addToBackStack(null); 
transaction.commit(); 

我的片段onCreateView看起来是这样的:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    View v = inflater.inflate(R.layout.mylayout, container, false); 
    TextView t = (TextView) v.findViewById(R.id.texttobereplaced); 
    t.setText(savedInstanceState.getString("text"); 
} 

似乎savedInstranceState是空的。我应该在哪里找到我的包?

EDIT2:

错过了在答复getArguments()。现在正在工作。

回答

17

Fragment没有连接到Activity然而,这也意味着你的布局不是招还没有被充气(见Fragment lifecycle)。这里最好的解决方案是通过Fragment.setArguments(Bundle)方法将String值作为参数添加到Fragment。这可以通过Fragment.getArguments()方法在接收Fragment中检索。

+1

我的布局充气onViewCreated被调用。我可以看到我的布局。 – AndyAndroid 2012-07-31 18:02:57

2

,所以我也使用相同的片段事务管理器,唯一的问题,我可以与你的代码中看到的是你定义TextView的电视你对你的newFragment类的onCreateView方法里面,然后实例它是这样的:

public class AboutFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.newFragment, container, false); 
     TextView tv = (TextView) v.findViewById(R.id.textview); 
     return v; 
    } 

    public void setMyString(String s) { 
     tv.setText(s); 
    } 
} 

我知道这一点儿也不做真的太大的意义,但是那是多么我运行我的代码,它工作正常:)

+0

对不起,不知道这是重要的:)改变它..hopfully现在看起来更好 – Android2390 2012-07-31 15:38:24

+3

当然缩进你的代码是重要的StackOverflow ...人们不会认为你是一个非常可信的来源,如果你的代码是公然不可读的。我刚刚编辑了你的答案,并删除了downvote。 – 2012-07-31 15:43:24

20

确保您在onAttach()之中或之后致电getActivity(),如之前那样它将返回null

+0

对不起,我不明白我要在哪里调用getActivity()并将它传递给我的setMyString()函数。如果我这样做,你建议你仍然写它可能会或可能不会返回null。我该如何理解这一点? – AndyAndroid 2012-07-31 18:05:49

+6

'片段'将被附加到'null'活动,直到'onActivityCreated' ...也就是说,如果你在'onCreate'或'onCreateView'中调用'getActivity()',它将返回'null',因为'活动“尚未创建。因此,确保你在*'onActivityCreated'中或之后对'getActivity()'*进行了所有的调用。 – 2012-07-31 18:12:40

+4

这是错误的。一旦onAttach被调用getActivity()可以在不返回null的情况下被调用。 onActivityCreated只是完成活动时的回调,并且片段的布局已经实例化。 – dymmeh 2014-04-03 15:35:19

0

如果u需要调用getActivity在OnCreateView,从onCreateView将所有我们的代码,以onActivityCreate和只剩线

View v = inflater.inflate(R.layout.xxxx, container, false); 
    return v; 

在onCreateView

,但我有一个有趣的情况。

在我onActivityCreated

Spinner s1 = (Spinner) getActivity().findViewById(R.id.bitlength); 
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
      getActivity(), R.array.bitlengths, 
      android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    s1.setAdapter(adapter); 

某个时刻onActivityCreated不会运行(正确!?),因此微调S1成为空谈。