Android 片段中的findViewById
我试图在片段中创建一个ImageView,该片段将引用我在XML中为片段创建的ImageView元素。但是,Android 片段中的findViewById,android,android-fragments,android-imageview,findviewbyid,Android,Android Fragments,Android Imageview,Findviewbyid,我试图在片段中创建一个ImageView,该片段将引用我在XML中为片段创建的ImageView元素。但是,findViewById方法仅在扩展活动类时有效。还有什么我可以在片段中使用的吗 public class TestClass extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { I
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);
}
}
findViewById
方法有一个错误,表明该方法未定义。使用或执行onViewCreated
方法中的View参数。它返回片段的根视图(由onCreateView()
方法返回的根视图)。有了它,您可以调用findviewbyd()
由于
getView()
只能在onCreateView()
之后工作,因此不能在片段的onCreate()
或onCreateView()
方法中使用它。需要膨胀片段的视图,并在它返回的视图上调用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(),该函数在所有视图膨胀后立即调用。这是填写片段的成员视图变量的正确位置。下面是一个例子:
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);
}
}
我意识到这是一个老生常谈的问题,但普遍的答案令人不满意
问题不清楚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;
}
}
同意在视图上调用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);
}
就像这里一样:(在API级别28中不推荐)
及
是可能的。在Fragment
类中,您将获得override方法,在该方法中,您应该始终初始化视图,因为在此方法中,您可以获得视图对象,您可以使用该对象查找视图,如:
@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()
,则不会自动调用onViewCreated()
方法。
默认情况下,如果ListFragment
作为ListFragment
返回FrameLayout
,则会调用它
注意:成功执行onCreateView()
后,可以使用getView()
在类中的任何位置获取片段视图。
i、 e
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);
}
您可以使用Activity对象调用findViewById()
,进入片段中的public void-onAttach(Activity-Activity)
方法
将活动保存到变量中,例如:
在片段类中:
私人活动main活动代码>
在onAttach()方法中:
this.mainActivity=activity代码>
最后通过VARABLE执行每个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级的文件
引用,在后堆栈中
短代码
/**
* 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;
}
使用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);
它将在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
@Override
public 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
@Override
public 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
}}
试一试
试试这个它对我有用
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);
}
}
在片段中,我们需要一个该窗口的视图,以便对该片段进行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;
}
}
布局充气机进入图片这里。Layout 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;
}
}
注:
从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;
}
1) 首先膨胀碎片的布局,然后可以使用findviewbyId
View view = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
return view;
在Fragment
类中,我们得到了onViewCreated()
重写方法,在该方法中我们应该始终初始化视图,因为在该方法中我们得到了视图
对象。使用此对象,我们可以找到如下视图:
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);
}
}
我喜欢一切都有条理。你可以这样做
首先初始化视图
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);
}
那么,onCreate方法在片段中有用吗?onCreateView创建并返回视图
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;
}
View view = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
return 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);
}
}
private ImageView imageView;
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
findViews(view);
}
private void findViews(View v) {
imageView = v.findViewById(R.id.img);
}