在片段中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的成员View
variables的正确的地方。 这是一个例子:
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()来强制事务完成。 之后,引用视图按预期工作!