Android:Fragment无法获得活动

And*_*oid 18 android android-fragments

我有一个执行片段事务的活动

DetailFragment newFragment = new DetailFragment();
transaction.replace(R.id.mylist, newFragment);
transaction.addToBackStack(null);
transaction.commit();
Run Code Online (Sandbox Code Playgroud)

工作正常.现在我在我的活动中知道了一个动态字符串,我需要在newFragment中的布局中替换它.我以为我可以在transaction.commit()之后调用类似的东西

newFragment.setMyString("my dynamic value");
Run Code Online (Sandbox Code Playgroud)

而在newFragment.java中我有

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

关键是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();
Run Code Online (Sandbox Code Playgroud)

我的片段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");
}
Run Code Online (Sandbox Code Playgroud)

看来savedInstranceState是空的.我应该在哪里找到我的捆绑包?

EDIT2:

在回复中错过了getArguments().现在正在工作.

Ale*_*ood 20

确保你getActivity()onAttach()之前或之后打电话,然后它将返回null.

  • `Fragment`将附加到`null`活动,直到`onActivityCreated` ...也就是说,如果在`onCreate`或`onCreateView`中调用`getActivity()`,它将返回`null`,因为`Activity `尚未创建.因此,请确保在*onActivityCreated`之后或之后对`getActivity()`*进行所有调用. (6认同)
  • 这是错的.一旦onAttach被调用,就可以调用getActivity()而不返回null.onActivityCreated只是完全创建活动并且实例化片段布局的回调. (4认同)
  • @AlexLockwood为什么你声明它会在onCreate()中返回null?我在Android框架中看到很多例子,他们在onCreate()中调用getActivity().以下是一个示例:http://androidxref.com/4.4.3_r1.1/xref/packages/apps/Calendar/src/com/android/calendar/QuickResponseSettings.java (2认同)
  • 是的,我不知道为什么我写了......只要在`onAttach()`之后调用`getActivity()`,活动就应该可用.我编辑了我最初的回应来解决这个问题......说实话,我不确定这个答案是如何得到5个赞成票的.我猜我2年后更像是一个菜鸟.:P (2认同)

Jas*_*son 18

Fragment还没有附加Activity,这也意味着你的布局尚未膨胀(参见片段生命周期).这里最好的解决方案是将您的String值作为参数添加到Fragmentvia Fragment.setArguments(Bundle)方法中.这可以Fragment通过该Fragment.getArguments()方法在接收中检索.