从FragmentActivity获取Fragment的视图

32

我有一个 FragmentActivity,在其中添加了一个 Fragment。根据某些情况,我想要访问该片段布局中的 Buttons 并更改它们的点击监听器。

我的做法是:

View view = myFragment.getView();
Button myButton = (Button) view.findViewById(R.id.my_button);
myButton.setOnClickListener(new MyClickListener());

但是view变量总是null

我该如何获取活动的视图?


1
我的片段已经添加并且可见吗? - Ken Wolf
1
请注意,您正在调用 findViewById() 方法来查找您的活动视图层次结构,而不是 view 的。 - laalto
当你执行 Button myButton = (Button) findViewById(R.id.my_button); 时,你试图找到当前视图中的按钮,而不是你的 fragment view。因此它不能按预期工作。 - The Dark Knight
是的,我正在尝试实现SlidingMenu特性。实际上,在添加这个特性之前,一切都正常工作。 - Drastamat
你是在onActivityCreated方法里面做的吗? - Volodymyr Yatsykiv
显示剩余2条评论
5个回答

34
如果您想访问组件并设置一些数据,我建议在片段中创建一个类似于这样的方法:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class DetailFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.details, container, false);
        return view;
    }


    public void setSettings(){
        Button button = (Button) getView().findViewById(R.id.my_button);
        button.setOnClickListener(new MyClickListener());
    }
}

4
getView() 方法可能会返回 null,在许多情况下都是如此。如果我在 Activity 的 OnCreate 方法中调用 setSettings 方法,则会抛出异常。 - Varvara Kalinina
@VarvaraKalinina 所以 getView 只能在片段内部使用,而不能在活动中使用? - John
刚刚在一个活动中测试了一下,发现活动中没有getView方法(文档链接),你需要保留一个成员变量来引用XML根视图,但是将父元素的引用保存下来并不是一个理想的方式。可以查看片段的文档链接,其中包含getView方法。 - John
@John 在 Activity 中,您可以使用 findViewById(android.R.id.content)。 - Varvara Kalinina

19

试试这个:

public class YourFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
          return inflater.inflate(R.layout.your_fragment, null);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        View view = getView();
        if(view != null) {
            view.findViewById(R.id.my_button).setOnClickListener(new MyClickListener());
        }
    }
}

这段代码必须正常工作。 我希望这可以帮到你。


4
为了在片段中设置OnClickListeners,请在您的片段类中覆盖onViewCreated方法。
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    view.findViewById(R.id.yourId).setOnClickListener(this);
    //or
    getActivity().findViewById(R.id.yourId).setOnClickListener(this);
}

我试图设置一个定时任务,自动重新加载片段中的Webview,这种方法是我唯一有效的方法。我的项目在github上。
来源:这个答案

1
当您在扩展Fragment的类中初始化按钮时,最好在onViewCreated()方法中执行。这将确保视图已经存在。

0

在编程中,只需使用getRootView()方法即可在Activity中获取您的Fragment数据。

//below block of code write in activity.

EditText et = (EditText) v.getRootView().findViewById(R.id.name);
Log.d("Name", et.getText().toString());

name是片段的字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接