19

我有一个进行片段交易的活动

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 是空的。我应该在哪里找到我的捆绑包?

编辑2:

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

4

4 回答 4

20

确保您getActivity()在或之后调用onAttach(),因为之前它会返回null

于 2012-07-31T15:33:08.160 回答
18

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

于 2012-07-31T15:19:23.100 回答
2

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

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);
    }
}

我知道这并没有多大意义,但这就是我运行代码的方式,并且运行良好:)

于 2012-07-31T15:18:27.573 回答
0

如果您需要在 OnCreateView 中调用 getActivity,请将您的所有代码从 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 变为空。

于 2013-03-24T18:55:45.763 回答