1147

I am trying to create an ImageView in a Fragment which will refer to the ImageView element which I have created in the XML for the Fragment. However, the findViewById method only works if I extend an Activity class. Is there anyway of which I can use it in Fragment as well?

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ImageView imageView = (ImageView)findViewById(R.id.my_image);
        return inflater.inflate(R.layout.testclassfragment, container, false);
    }
}

The findViewById method has an error on it which states that the method is undefined.

4

37 回答 37

1548

使用getView()或实现该 onViewCreated方法的 View 参数。它返回片段的根视图onCreateView()方法返回的那个)。有了这个,你可以调用findViewById().

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
    // or  (ImageView) view.findViewById(R.id.foo); 

由于getView()仅在之后起作用onCreateView(),您不能onCreate()onCreateView()在片段的内部方法中使用它。

于 2011-06-27T16:34:19.647 回答
650

您需要膨胀 Fragment 的视图并调用findViewById()View返回。

public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container, 
                         Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.testclassfragment, container, false);
     ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
     return view;
}
于 2011-06-27T16:35:34.477 回答
148

Fragment类中,您将获得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);
}

永远记住,在 Fragment 的情况下,如果您返回 null 或from方法,则该onViewCreated()方法不会自动调用。在默认返回的情况下会默认调用它。super.onCreateView()onCreateView()ListFragmentListFragmentFrameLayout

注意:你可以在类中的任何地方通过使用getView()一次onCreateView()成功执行来获取片段视图。IE

getView().findViewById("your view id");
于 2014-03-04T14:46:21.050 回答
68

我意识到这是一个老问题,但普遍的答案还有待改进。

问题尚不清楚需要什么imageView- 我们是将其作为视图传递回来,还是只是保存参考以供以后使用?

无论哪种方式,如果ImageView来自膨胀的布局,正确的方法是:

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.testclassfragment, container, false);
        ImageView imageView = (ImageView)v.findViewById(R.id.my_image);
        return v;
    }
}
于 2013-04-11T10:46:03.657 回答
52

首先获取片段视图,然后从该视图获取您的 ImageView。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
    return view;
}
于 2011-06-27T16:35:53.613 回答
29

您也可以在onActivityCreated方法中执行此操作。

public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState);
}

就像他们在这里做的那样:http: //developer.android.com/reference/android/app/Fragment.html (在 API 级别 28 中已弃用)

getView().findViewById(R.id.foo);

getActivity().findViewById(R.id.foo);

是可能的。

于 2013-10-09T23:22:03.160 回答
29

Fragment类内部,我们得到onViewCreated()了覆盖方法,我们应该始终初始化我们的视图,因为在这个方法中我们得到了view对象。使用这个对象,我们可以找到如下视图:

class MyFragment extends Fragment {
    private ImageView imageView;

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

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        //initialize your view here for use view.findViewById("your view id")
        imageView = (ImageView) view.findViewById(R.id.my_image);
    }
}
于 2019-06-13T04:15:29.063 回答
20

getView()将给出根视图

View v = getView().findViewByID(R.id.x); 
于 2014-09-03T12:41:44.007 回答
18

您可以覆盖 onViewCreated() ,它在所有视图都被膨胀后立即调用。这是填写 Fragment 成员View变量的正确位置。这是一个例子:

class GalleryFragment extends Fragment {
    private Gallery gallery;

    (...)

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        gallery = (Gallery) view.findViewById(R.id.gallery);
        gallery.setAdapter(adapter);
        super.onViewCreated(view, savedInstanceState);
    }
}
于 2012-03-28T15:58:13.650 回答
16

getView()方法不适用于 OnCreate 和类似方法之外的片段。

您有两种方法,将视图传递给 oncreate 上的函数(这意味着您只能在创建视图时运行函数)或将视图设置为变量:

private View rootView;

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

public void doSomething () {
    ImageView thumbnail = (ImageView) rootView.findViewById(R.id.someId);
}
于 2014-03-30T01:02:05.340 回答
15

1)首先膨胀片段的布局,然后你可以使用 findviewbyId 。

View view = inflater.inflate(R.layout.testclassfragment, container, false);
             ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
             return view;
于 2018-01-30T09:51:02.660 回答
10
EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);  
于 2014-12-20T13:03:01.603 回答
10

同意调用findViewById()视图。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View V = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView) V.findViewById(R.id.my_image);

    return V;
}
于 2013-05-29T16:35:53.927 回答
10

笔记 :

从 API 级别 26 开始,您也不需要专门转换 findViewById 的结果,因为它对其返回类型使用推理。

所以现在你可以简单地做,

public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container, 
                         Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.testclassfragment, container, false);
     ImageView imageView =  view.findViewById(R.id.my_image); //without casting the return type
     return view;
}
于 2017-10-08T14:53:05.583 回答
9

利用

imagebutton = (ImageButton) getActivity().findViewById(R.id.imagebutton1);

imageview = (ImageView) getActivity().findViewById(R.id.imageview1);

它会起作用的

于 2015-03-29T08:53:56.040 回答
8

根据 API 级别 11 的文档

参考,在 Back Stack http://developer.android.com/reference/android/app/Fragment.html

短代码

/**
 * The Fragment's UI is just a simple text view showing its
 * instance number.
 */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.hello_world, container, false);
    View tv = v.findViewById(R.id.text);
    ((TextView)tv).setText("Fragment #" + mNum);
    tv.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.gallery_thumb));
    return v;
}
于 2014-10-13T02:02:18.077 回答
8

usinggetView()返回片段的视图,然后您可以调用findViewById()以访问片段视图中的任何视图元素。

于 2013-07-11T11:55:08.077 回答
8

试试这个它对我有用

public class TestClass extends Fragment {
    private ImageView imageView;

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

    private void findViews(View view) {
        imageView = (ImageView) view.findViewById(R.id.my_image);
    }
}
于 2016-12-08T09:11:17.010 回答
5

实现这一点的最佳方法如下:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

rootView = inflater.inflate(R.layout.testclassfragment, container, false);
        ImageView imageView = (ImageView) rootView.findViewById(R.id.my_image);
        return rootView
}

这样,xml布局中定义的每一个控件都可以使用rootView,这样代码就干净多了。

希望这可以帮助 :)

于 2014-08-28T12:11:27.550 回答
5

1)声明你的布局文件。

public View onCreateView(LayoutInflater inflater,ViewGroup container, 
                                 Bundle savedInstanceState) {
    return inflate(R.layout.myfragment, container, false);
}

2)然后,获取您的视图的ID

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    TextView nameView = (TextView) view.findViewById(R.id.textview1);
}
于 2016-02-01T19:08:20.953 回答
4

Use gradle skeleton plugin, it will automatically generate the view holder classes with the reference to your layout.

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        MyLayout myLayout = new MyLayout(inflater, container, false);
        myLayout.myImage.setImageResource(R.drawable.myImage);
        return myLayout.view;
    }
}

Now assuming you had an ImageView declared in your my_layout.xml file, it will automatically generate myLayout class for you.

于 2015-01-23T22:57:18.327 回答
4

尝试这个:

View v = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView img = (ImageView) v.findViewById(R.id.my_image);

return v;
于 2016-04-29T04:51:11.013 回答
4

尝试

private View myFragmentView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
myFragmentView = inflater.inflate(R.layout.myLayoutId, container, false);
myView = myFragmentView.findViewById(R.id.myIdTag)
return myFragmentView;
}
于 2016-05-20T12:47:01.850 回答
3

您可以使用您内部findViewById()活动对象进行调用public void onAttach(Activity activity)使用在Fragment 中

将 Activity 保存到变量中,例如:

片段类中: private Activity mainActivity;onAttach()方法中: this.mainActivity=activity;

最后通过变量执行每个 findViewById: mainActivity.findViewById(R.id.TextView);

于 2014-08-06T15:31:39.610 回答
3

我喜欢一切都井井有条。你可以这样做。

首先初始化视图

private ImageView imageView;

然后覆盖 OnViewCreated

@Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        findViews(view);
    }

然后添加一个void方法来查找视图

private void findViews(View v) {
    imageView = v.findViewById(R.id.img);
}
于 2020-10-08T20:22:15.083 回答
3

还有一种称为 onViewCreated 的方法。

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ImageView imageView = (ImageView) view.findViewById(R.id.imageview1);
}
于 2015-12-31T07:57:39.747 回答
2
//here you can do it by
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState)
  {
    // Inflate the layout for this fragment
    final View view =  inflater.inflate(R.layout.fragment_apple, container, 
 false);
    ist = view.findViewById(R.id.linearLink);
    second = view.findViewById(R.id.linearPhone);
    return view;
于 2021-03-25T07:24:26.253 回答
2

布局充气机在这里出现。Layout inflater 是一个使我们能够在 java 代码中使用 XML 视图的类。因此,您可以使用以下代码扩展变量 v 中的根 xml 视图。然后使用 v,可以找到根视图 v 的子视图。

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView)v.findViewById(R.id.my_image);
    return v;
    }
}
于 2017-07-28T19:56:45.567 回答
2

在片段中,我们需要该窗口的视图,以便我们创建此片段的 onCreateView。

然后获取视图并使用它来访问该视图元素的每个视图 id..

  class Demo extends Fragment
    {
        @Override
        public View onCreateView(final LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState)
        {
            View view =inflater.inflate(R.layout.demo_fragment, container,false);
            ImageView imageview=(ImageView)view.findViewById(R.id.imageview1);

            return view;
        }
    }
于 2017-06-06T09:26:57.753 回答
2

getView() onCreateView()完成后才起作用,因此请从以下位置调用它onPostCreate()

@Override
public void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
}
于 2018-11-06T03:10:47.117 回答
2

onCreateView 方法内部

1)首先你必须膨胀你想要添加的布局/视图,例如。线性布局

LinearLayout ll = inflater.inflate(R.layout.testclassfragment, container, false);

2)然后你可以从布局中找到你的imageView id

ImageView imageView = (ImageView)ll.findViewById(R.id.my_image);

3)返回膨胀的布局

return ll;
于 2015-12-06T18:46:30.717 回答
2

你必须给视图充气

public class TestClass extends Fragment {

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView)v.findViewById(R.id.my_image);
    return v
}}
于 2016-05-20T12:45:01.707 回答
1

使用这些东西的最简单方法是使用黄油刀通过这种方式,您可以通过 @OnClick() 添加尽可能多的 Onclciklistener,如下所述:

public class TestClass extends Fragment {
    @BindView(R.id.my_image) ImageView imageView;
    @OnClick(R.id.my_image)
    public void my_image_click(){
        yourMethod();
    }
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.testclassfragment, container, false);
        ButterKnife.bind(getActivity,view);
        return view;
    }
}
于 2017-01-13T10:16:44.880 回答
1

非常简单的做法:

 @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View fragmentView = inflater.inflate(R.layout.testclassfragment, container, false);
            ImageView imageView = (ImageView)fragmentView.findViewById(R.id.my_image);
            return fragmentView;
       }
于 2020-06-11T09:46:59.087 回答
0
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.testclassfragment, container, false);
     ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
     return view;
}

请注意,如果您使用getView()它可能会导致的方法,nullPointerException因为它返回根视图,并且它将是onCreateView()方法后的一些视图。

于 2017-03-06T22:24:57.167 回答
0
ImageView imageView;
public View onCreateView(LayoutInflater inflater, 
                     ViewGroup container, 
                     Bundle savedInstanceState) {
 View view = inflater.inflate(R.layout.testclassfragment, container, false);
 imageView = view.findViewById(R.id.my_image);
 return view;

}

于 2022-01-29T09:52:38.047 回答
-3

.commit() 之后的事务时间也可能导致此问题

我遇到了同样的问题(无法访问片段中的视图)。原因是,在 (FragmentTransaction) .commit()之后,视图没有在 UI 中激活。无法保证.commit() 之后的事务何时发生;它只是排队。所以我添加了一个 (FragmentManager) .executePendingTransactions()来强制完成事务。之后,引用视图按预期工作!

于 2015-04-24T09:50:23.177 回答