在片段中findViewById

我正在尝试在Fragment中创build一个ImageView,它将引用我在XML中为Fragment创build的ImageView元素。 但是, findViewById方法只适用于扩展Activity类的情况。 还有,我还可以在片段中使用它吗?

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

findViewById方法有一个错误,说明该方法是未定义的。

使用getView()或View参数来实现onViewCreated方法。 它返回片段的根视图(由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()方法使用它

你需要膨胀Fragment的视图,并在它返回的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; } 

Fragment类中,你将获得onViewCreated()重写方法,你应该总是初始化你的视图,就像在这个方法中你得到的视图对象一样,你可以find你的视图,如:

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

永远记得在片段的情况下,如果您从onCreateView()方法返回null或super.onCreateView() ,则不会自动调用super.onCreateView() onCreateView()方法。 它将在默认情况下在ListFragment情况下被调用为ListFragment返回FrameLayout

注意:一旦onCreateView()成功执行,您可以使用getView()来获取片段视图。 即

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

我意识到这是一个古老的问题,但普遍的答案留下了一些不尽人意的地方。

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

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

getView()会给根视图

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

你可以重写onViewCreated(),在所有视图被充满之后调用它。 这是填充你的Fragment的成员Viewvariables的正确的地方。 这是一个例子:

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

你也可以在onActivityCreated方法中做到这一点。

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

就像他们在这里: http : //developer.android.com/reference/android/app/Fragment.html

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

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

是可能的。

方法getView()不会在OnCreate和类似的方法之外的片段上工作。

你有两种方法,将视图传递给oncreate上的函数(这意味着只有当视图被创build时才能运行你的函数)或者将视图设置为一个variables:

 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); } 
 EditText name = (EditText) getView().findViewById(R.id.editText1); EditText add = (EditText) getView().findViewById(R.id.editText2); 

同意在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; } 

根据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. */ @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; } 

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

使用

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

它会工作

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

实现这个最好的方法如下:

 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布局中定义的每个控件,并且代码更加清洁。

希望这可以帮助 :)

试试这对我有用

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

使用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类。

还有一个方法叫onViewCreated。

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

尝试这个:

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

尝试

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

你可以调用findViewById()和你的Fragment中的public void onAttach(Activity activity)方法获得的Activity对象

将活动保存到一个variables中,例如:

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

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

里面的onCreateView方法

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

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

2)然后,你可以从布局中find你的imageView id

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

3)返回膨胀的布局

 return ll; 

你必须夸大观点

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

布局充气器在这里进入图片。 布局inflater是一个类,使我们能够在Java代码中使用XML视图。 所以你可以使用下面的代码来扩充variablesv中的根xml视图。 然后使用v,你可以find根视图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级别26开始,您也不需要特别强调findViewById的结果,因为它为返回types使用推理。

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

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

使用这种东西最简单的方法是使用butterknife通过这个,你可以通过@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()方法后的一些视图。

在片段中,我们需要该窗口的视图,以便我们创build这个片段的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; } } 

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

我得到了同样的问题(查看片段无法达成)。 结果是,紧接着(FragmentTransaction) .commit()之后 ,View并没有在UI中被激活。 在.commit()之后,交易不会发生; 它只是排队。 所以我添加了(FragmentManager) .executePendingTransactions()来强制事务完成。 之后,引用视图按预期工作!