我正在尝试在片段中创建一个ImageView,它将引用我在片段的XML中创建的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
方法有一个错误,表明该方法未定义。
答案 0 :(得分:1337)
使用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()
方法中使用它。
答案 1 :(得分:591)
您需要对片段的视图进行充气,并在其返回的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;
}
答案 2 :(得分:123)
在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的情况下,如果您从onViewCreated()
方法返回null或super.onCreateView()
,则不会自动调用onCreateView()
方法。
默认情况下,如果ListFragment
ListFragment
返回FrameLayout
,则会默认调用它。
注意:一旦getView()
成功执行,您可以使用onCreateView()
在类中的任何位置获取片段视图。
即。
getView().findViewById("your view id");
答案 3 :(得分:65)
我意识到这是一个古老的问题,但是流行的答案还有待改进。
问题不明确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;
}
}
答案 4 :(得分:44)
首先获取片段视图,然后从此视图中获取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;
}
答案 5 :(得分:23)
您也可以在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);
是可能的。
答案 6 :(得分:18)
getView()
将提供根视图
View v = getView().findViewByID(R.id.x);
答案 7 :(得分:17)
您可以覆盖在所有视图被夸大后立即调用的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);
}
}
答案 8 :(得分:14)
方法 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);
}
答案 9 :(得分:10)
1)首先填充Fragment的布局然后你可以使用findviewbyId。
View view = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
return view;
答案 10 :(得分:10)
EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);
答案 11 :(得分:9)
同意在视图上调用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;
}
答案 12 :(得分: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;
}
答案 13 :(得分:8)
注意:
从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;
}
答案 14 :(得分:8)
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);
}
答案 15 :(得分:8)
使用
imagebutton = (ImageButton) getActivity().findViewById(R.id.imagebutton1);
imageview = (ImageView) getActivity().findViewById(R.id.imageview1);
它会起作用
答案 16 :(得分:8)
使用getView()
返回片段的视图,然后您可以调用findViewById()
来访问片段视图中的任何视图元素。
答案 17 :(得分:7)
试试这个对我有用
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);
}
}
答案 18 :(得分:5)
还有一个名为onViewCreated的方法。
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ImageView imageView = (ImageView) view.findViewById(R.id.imageview1);
}
答案 19 :(得分: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
}
通过这种方式,rootView可以用于xml布局中定义的每个控件,并且代码更加清晰。
希望这会有所帮助:)
答案 20 :(得分:4)
使用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;
}
}
现在假设您在ImageView
文件中声明了my_layout.xml
,它会自动为您生成myLayout课程。
答案 21 :(得分:4)
试试这个:
View v = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView img = (ImageView) v.findViewById(R.id.my_image);
return v;
答案 22 :(得分: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;
}
答案 23 :(得分:3)
在 Fragment
类中,您将获得onViewCreated()
覆盖方法,该方法应始终初始化视图,因为在此方法中,您获得 view
对象,使用该对象可以找到您的视图,例如:
class MyFragment extends Fragment {
private ImageView imageView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment_layout, container, false);
return view;
}
@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);
}
}
答案 24 :(得分:3)
您可以使用活动对象调用findViewById()
,然后进入片段内的public void onAttach(Activity activity)
方法。
将活动保存到变量中,例如:
在 Fragment类中:
private Activity mainActivity;
在onAttach()
方法中:
this.mainActivity=activity;
最后通过vairable执行每个findViewById:
mainActivity.findViewById(R.id.TextView);
答案 25 :(得分:2)
在onCreateView方法中
1)首先,您必须为要添加的布局/视图充气 例如。的LinearLayout
LinearLayout ll = inflater.inflate(R.layout.testclassfragment, container, false);
2)然后你可以从布局
找到你的imageView idImageView imageView = (ImageView)ll.findViewById(R.id.my_image);
3)返回膨胀的布局
return ll;
答案 26 :(得分:2)
布局inflater在这里出现。布局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;
}
}
答案 27 :(得分: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;
}
}
答案 28 :(得分: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
}}
答案 29 :(得分: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;
}
}
答案 30 :(得分:1)
getView()
仅在 onCreateView()
完成后起作用,因此请从onPostCreate()
调用它:
@Override
public void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
}
答案 31 :(得分:1)
//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;
答案 32 :(得分: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
,因为它会返回rootview,并且会在onCreateView()
方法之后显示一些视图。
答案 33 :(得分:0)
非常简单的方法:
@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;
}
答案 34 :(得分:0)
我喜欢一切都井井有条。您可以通过这种方式进行。
第一个初始化视图
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);
}
答案 35 :(得分:-3)
我遇到了同样的问题(无法访问片段中的视图)。原因是 - 在(FragmentTransaction) .commit()之后 - ,在UI中尚未激活View。 无法保证何时,在.commit()之后,交易发生;它只排队。所以我添加了一个(FragmentManager) .executePendingTransactions()来强制完成交易。之后,引用View按预期工作!