我正在尝试在 Fragment 中创建一个 ImageView,它将引用我在 XML 中为 Fragment 创建的 ImageView 元素。但是,findViewById
方法仅在我扩展 Activity 类时才有效。无论如何,我也可以在 Fragment 中使用它吗?
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() 或实现 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()
方法中使用它。
您需要扩展 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;
}
NullPointerException
。
在 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 的情况下,如果您从 onCreateView()
方法返回 null 或 super.onCreateView()
,则不会自动调用 onViewCreated()
方法。在 ListFragment
的情况下默认调用它,因为 ListFragment
默认返回 FrameLayout
。
注意:一旦 onCreateView()
成功执行,您可以使用 getView()
在类中的任何位置获取片段视图。 IE
getView().findViewById("your view id");
view
传递给 onViewCreated
仍然会导致 NullPointerException
但使用 getActivity()
很好。任何想法为什么?
onCreateView
方法返回视图。我刚刚调试过,结果发现有一个布局(在我的例子中是 FrameLayout
)。话虽如此,当我尝试查找它返回 null
的元素时。为什么会这样?
我意识到这是一个老问题,但普遍的答案还有待改进。
问题不清楚 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;
}
在 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);
}
}
您也可以在 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);
是可能的。
getView()
将给出根视图
View v = getView().findViewByID(R.id.x);
您可以覆盖 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);
}
}
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);
}
1)首先膨胀片段的布局,然后你可以使用 findviewbyId 。
View view = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
return 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;
}
EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);
笔记 :
从 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;
}
利用
imagebutton = (ImageButton) getActivity().findViewById(R.id.imagebutton1);
imageview = (ImageView) getActivity().findViewById(R.id.imageview1);
它会起作用的
根据 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;
}
使用 getView()
返回片段的视图,然后您可以调用 findViewById()
访问片段视图中的任何视图元素。
试试这个它对我有用
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);
}
}
实现这一点的最佳方法如下:
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,这样代码就干净多了。
希望这可以帮助 :)
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);
}
使用 gradle skeleton plugin,它会根据您的布局自动生成视图持有者类。
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 类。
尝试这个:
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;
}
getView()
您可以使用您在 Fragment 中的 public void onAttach(Activity activity)
方法中获得的 Activity Object 调用 findViewById()
。
将 Activity 保存到变量中,例如:
在 Fragment 类 中:private Activity mainActivity;
在 onAttach()
方法中:this.mainActivity=activity;
最后通过变量执行每个 findViewById:mainActivity.findViewById(R.id.TextView);
还有一种称为 onViewCreated 的方法。
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ImageView imageView = (ImageView) view.findViewById(R.id.imageview1);
}
我喜欢一切都井井有条。你可以这样做。
首先初始化视图
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);
}
//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;
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;
你必须给视图充气
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
}}
在片段中,我们需要该窗口的视图,以便我们创建此片段的 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;
}
}
ImageView
来自膨胀的布局,这将无济于事 - 有关详细信息,请参阅我的答案。否则, onCreateView 是执行此操作的正确位置@N-AccessDevonActivityCreated()
是查找和存储对您的视图的引用的推荐位置。您必须通过在onDestroyView()
中将它们设置回null
来清理这些存储的引用,否则您将泄漏Activity
。