[英]findViewById in Fragment
我正在嘗試在 Fragment 中創建一個 ImageView,它將引用我在 XML 中為 Fragment 創建的 ImageView 元素。 但是,
findViewById<\/code>方法僅在我擴展 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);
}
}
使用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()
方法中使用它。
您需要膨脹片段的觀點,並調用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;
}
在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);
}
永遠記住,如果您從onCreateView()
方法返回 null 或super.onCreateView()
,則在 Fragment 的情況下, onViewCreated()
方法不會自動調用。 在ListFragment
情況下,默認情況下會調用它,因為默認情況下ListFragment
返回FrameLayout
。
注意:一旦onCreateView()
成功執行,您可以使用getView()
在類中的任何位置獲取片段視圖。 IE
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;
}
您也可以在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);
是可能的。
在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);
}
}
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) 首先膨脹 Fragment 的布局,然后您可以使用 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);
它會工作
使用getView()
返回片段的視圖,然后您可以調用findViewById()
來訪問片段視圖中的任何視圖元素。
根據 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;
}
試試這個對我有用
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;
}
您可以使用在 Fragment 中的public void onAttach(Activity activity)
方法中獲取的Activity 對象調用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);
}
在 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;
}
}
布局充氣機在這里出現。 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;
}
}
我試圖在一個Fragment中創建一個ImageView,該ImageView引用我在Fragment的XML中創建的ImageView元素。 但是,僅當我擴展Activity類時, findViewById
方法才有效。 無論如何,我也可以在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
方法上有一個錯誤,指出該方法未定義。
//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;
使用這些東西的最簡單方法是使用黃油刀。這樣,您就可以通過@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;
}
}
非常簡單的做法:
@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;
}
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()
方法之后它將是一些視圖。
private val recyclerView: RecyclerView by lazy { requireView().findViewById() }
ImageView imageView;
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.testclassfragment, container, false);
imageView = view.findViewById(R.id.my_image);
return view;
}
我遇到了同樣的問題(無法訪問片段中的視圖)。 結果證明,在 (FragmentTransaction) .commit() 之后,該視圖尚未在 UI 中激活。 在 .commit() 之后,無法保證交易何時發生; 它只是排隊。 所以我添加了一個 (FragmentManager) .executePendingTransactions()來強制完成交易。 之后,引用視圖按預期工作!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.