簡體   English   中英

片段中的 findViewById

[英]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;

}

.commit() 之后的事務時間也可能導致此問題

我遇到了同樣的問題(無法訪問片段中的視圖)。 結果證明,在 (FragmentTransaction) .commit() 之后,該視圖尚未在 UI 中激活。 在 .commit() 之后,無法保證交易何時發生; 它只是排隊。 所以我添加了一個 (FragmentManager) .executePendingTransactions()來強制完成交易。 之后,引用視圖按預期工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM