片段中的findViewById

我正试图在一个片段中创建一个ImageView,它将引用我在XML中为片段创建的ImageView元素。然而,findViewById方法仅在我扩展一个活动类时有效。有没有什么我也可以在片段中使用它?

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

748364 次浏览

使用获取视图或实现onViewCreated方法的View参数。它返回片段(由#1方法返回的)的根视图。有了这个,你可以调用findViewById()

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

由于getView()仅在onCreateView()之后起作用,因此片段的不能在#2或#1方法中使用它

您需要膨胀Fra的视图并在它返回的View上调用findViewById()

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

首先获取片段视图,然后从该视图获取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;}

你可以重写onViewCreated(),它在所有视图膨胀后立即调用。这是填充片段成员View变量的正确位置。这是一个例子:

class GalleryFragment extends Fragment {private Gallery gallery;
(...)
@Overridepublic void onViewCreated(View view, Bundle savedInstanceState) {gallery = (Gallery) view.findViewById(R.id.gallery);gallery.setAdapter(adapter);super.onViewCreated(view, savedInstanceState);}}

我意识到这是一个古老的问题,但普遍的答案留下了一些不足之处。

问题不清楚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;}}

同意在View上调用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;}

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

您也可以在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);

是可能的。

Fragment类中,您将获得onViewCreated()创建视频覆盖方法,您应该始终初始化您的视图,因为在这个方法中,您会获得视图对象,您可以使用它找到您的视图,例如:

@Overridepublic void onViewCreated(View view, Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);view.findViewById(R.id.yourId).setOnClickListener(this);
// orgetActivity().findViewById(R.id.yourId).setOnClickListener(this);}

请始终记住,如果您从onCreateView()方法返回null或super.onCreateView(),则不会自动调用onViewCreated()方法。默认情况下,它将在ListFragment的情况下调用,因为ListFragment默认返回FrameLayout

注意:一旦onCreateView()成功执行,您可以通过使用getView()在类中的任何位置获取片段视图。即

getView().findViewById("your view id");

方法获取视图不适用于OnCreate和类似方法之外的片段。

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

private View rootView;
@Overridepublic 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);}

你可以调用findViewById()活动对象你在你的public void onAttach(Activity activity)方法在你的片段。

将活动保存到变量中,例如:

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

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

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

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}

通过这种方式,rootView可以用于xml布局中定义的每个控件,并且通过这种方式代码更清晰。

希望有帮助:)

getView()将给出根视图

View v = getView().findViewByID(R.id.x);

根据API级别11的留档

参考,在后端堆栈中http://developer.android.com/reference/android/app/Fragment.html

短代码

/*** The Fragment's UI is just a simple text view showing its* instance number.*/@Overridepublic 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;}
EditText name = (EditText) getView().findViewById(R.id.editText1);EditText add = (EditText) getView().findViewById(R.id.editText2);

使用gradle骨骼插件,它会自动生成对布局的引用的视图持有者类。

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

现在假设您在my_layout.xml文件中声明了ImageView,它将自动为您生成myLayout类。

使用

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

它会起作用的

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

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

在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;

还有一个名为onViewCreated的方法。

@Overridepublic void onViewCreated(View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);ImageView imageView = (ImageView) view.findViewById(R.id.imageview1);}

1)声明您的布局文件。

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

2)然后,获取你的视图的id

@Overridepublic void onViewCreated(View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);TextView nameView = (TextView) view.findViewById(R.id.textview1);}

试试这个:

View v = inflater.inflate(R.layout.testclassfragment, container, false);ImageView img = (ImageView) v.findViewById(R.id.my_image);
return 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}}

尝试

private View myFragmentView;
@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){myFragmentView = inflater.inflate(R.layout.myLayoutId, container, false);myView = myFragmentView.findViewById(R.id.myIdTag)return myFragmentView;}

试试这个对我有用

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

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

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;}}
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,因为它返回rootview,并且它将是onCreateView()方法之后的一些视图。

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

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

  class Demo extends Fragment{@Overridepublic 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;}}

布局膨胀器在这里进入画面。布局膨胀器是一个使我们能够在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;}}

备注:

从API Level 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 typereturn view;}

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

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

getView()只工作之后onCreateView()完成,所以从onPostCreate()调用它:

@Overridepublic void onPostCreate(Bundle savedInstanceState) {super.onPostCreate(savedInstanceState);ImageView imageView = (ImageView) getView().findViewById(R.id.foo);}

#0类中,我们得到了onViewCreated()覆盖方法,我们应该始终初始化我们的视图,因为在这个方法中我们得到了#2对象。使用这个对象,我们可以像下面这样找到我们的视图:

class MyFragment extends Fragment {private ImageView imageView;
@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.my_fragment_layout, container, false);}
@Overridepublic 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);}}

非常简单的方法去做:

 @Nullable@Overridepublic 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;}

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

先初始化视图

private ImageView imageView;

然后覆盖OnViewCreated

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

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

private void findViews(View v) {imageView = v.findViewById(R.id.img);}
//here you can do it bypublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){// Inflate the layout for this fragmentfinal View view =  inflater.inflate(R.layout.fragment_apple, container,false);ist = view.findViewById(R.id.linearLink);second = view.findViewById(R.id.linearPhone);return view;
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;

}