首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android: Fragment无法获取活动

Android: Fragment无法获取活动
EN

Stack Overflow用户
提问于 2012-07-31 23:11:23
回答 4查看 68.9K关注 0票数 19

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

代码语言:javascript
复制
DetailFragment newFragment = new DetailFragment();
transaction.replace(R.id.mylist, newFragment);
transaction.addToBackStack(null);
transaction.commit();

这很好用。现在,在我的活动中,我知道了需要在newFragment布局中替换的动态字符串。我想我可以在transaction.commit()之后调用,就像这样

代码语言:javascript
复制
newFragment.setMyString("my dynamic value");

在newFragment.java中,我有

代码语言:javascript
复制
public void setMyString(String s)
{
 TextView tv = (TextView) getActivity().findViewById(R.id.myobject);
 tv.setText(s);
}

关键是getActivity()返回null。如何获得查找布局元素所需的上下文?

编辑:

我尝试使用捆绑的路线,因为这似乎是最干净的方式。所以我改变了我的代码:

代码语言:javascript
复制
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如下所示:

代码语言:javascript
复制
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()。现在可以工作了。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-31 23:19:23

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

票数 18
EN

Stack Overflow用户

发布于 2012-07-31 23:33:08

确保在onAttach()中或之后调用getActivity(),如前所述,它将返回null

票数 20
EN

Stack Overflow用户

发布于 2012-07-31 23:18:28

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

代码语言:javascript
复制
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);
    }
}

我知道这没有多大意义,但这就是我运行代码的方式,它工作得很好:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11743272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档