【问题标题】:Get view of Fragment from FragmentActivity从 FragmentActivity 获取 Fragment 的视图
【发布时间】:2013-06-06 01:53:45
【问题描述】:

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

我做的是:

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

view 变量始终是null

如何获得活动的视图?

【问题讨论】:

  • myFragment 是否已添加且可见?
  • 请注意,您在 Activity 的视图层次结构中调用 findViewById(),而不是 view
  • 当你这样做时:Button myButton = (Button) findViewById(R.id.my_button);,你试图找出你当前视图的按钮,而不是你的fragment view。因此它没有按预期工作。
  • 是的。我正在尝试实现 SlidingMenu 功能。实际上,在添加此功能之前一切正常。
  • @laalto,抱歉,这里打错了。编辑了帖子。

标签: android android-fragments android-fragmentactivity


【解决方案1】:

如果你想访问你的组件并设置一些数据,我建议你在片段中创建一个方法,如下所示:

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

【讨论】:

  • getView() 可能会返回 null 并且在很多情况下都会这样做。如果我从 Activity 的 OnCreate 方法调用 setSettings,则会抛出异常
  • @VarvaraKalinina 所以getView 只能在片段内部起作用,而不能在活动中起作用?
  • 刚刚用一个activity测试了一下,在一个activity(doc link)中没有getView这样的方法,需要为xml根视图保留一个成员变量,不是很理想保留对父元素的引用。 doc link 用于显示 getView 方法的片段
  • @John 如果是 Activity,您可以使用 findViewById(android.R.id.content)
【解决方案2】:

试试这个:

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

此代码必须可以正常工作。 希望对您有所帮助。

【讨论】:

    【解决方案3】:

    要在片段中设置 OnClickListener,请在片段类中覆盖 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);
    }
    

    我试图设置一个 timertask 来自动重新加载片段中的 webview,这个方法是唯一对我有用的方法。我的项目在github

    来源:this answer

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        只需使用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 是片段的字段。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-31
          • 1970-01-01
          • 2014-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多