フラグメント内のfindViewById


1035

フラグメントのXMLで作成したImageView要素を参照するフラグメントで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メソッドは、メソッドが定義されていないことを述べ、その上にエラーが発生しました。


AndroidのButterKnifeビューバインディングライブラリを使用します。また、それがどのように機能するか、Androidアプリ開発に統合して使用して、開発をより速くする方法を示します。
聖武天皇

「しばらく」時間が経過しましたが、まだ回答を受け入れていません。これが回答済みとしてマークされるように、最も役に立った回答を選択できますか?
David3103

手動のfindViewByIdの代わりにデータバインディングまたはorang Viewバインディングを使用することをお勧めします
mochadwi

回答:


1433

利用getViewメソッド()または実装からの眺めパラメータ 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()メソッドフラグメントの。


323
注:onCreateView()の後でのみ機能します。したがって、これをonCreate()で使用することはできません
Dmitry Zaytsev 2012年

7
onCreateが適切な場所でない場合、これを実装するためにオーバーライドできる関数は何ですか?
Nico AD

16
これがImageView膨張したレイアウトからのものである場合、これは役に立ちません-詳細については私の答えを参照してください。それ以外の場合は、これを行うのにonCreateViewが適切です@ N-AccessDev
MattJenko 2013

25
onViewCreatedメソッドでこれを行うのに最適な場所
advantej 2013

37
ドキュメントにはonActivityCreated()、ビューへの参照を検索および保存するための推奨される場所が記載されています。あなたはしなければならない背中にそれらを設定することにより、これらの保存された参照をクリーンアップnullonDestroyView()またはあなたがリークしますActivity
Monstieur 2014年

618

あなたはフラグメントのビューを膨らませ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;
}

4
V.findViewById(R.id.someid)を実行すると、インフレートされたビューにあるすべてのウィジェットに対してのみ機能します。彼が膨張させようとしているimageViewが膨張したビューの外にある場合はどうなりますか?
Raunak

18
次に、imageViewを「所有」して拡張するクラスは、それへのパブリックアクセスを提供する必要があります。しかし、それは非常に悪い習慣です。フラグメントは、レイアウトに存在するUI要素にのみアクセスできる必要があります。
LeffelMania 2011年

1
私のコードではなく、コードに問題があるようです(バックグラウンドスレッドからUIを更新しています)。
LeffelMania 14

1
ありがとう、それは役に立ちました。無関係なコメントとして:コードではJavaの命名規則を守るようにしてください。「V」はJavaの変数名のようには見えません。
altumano 2014年

3
これが正解です。受け入れられたものはあなたに任せますNullPointerException
マチャド

132

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()from onCreateView()メソッドを返す場合、メソッドが自動的に呼び出されないことを常に覚えておいてください。これは、の場合には、デフォルトで呼び出されるListFragmentようにListFragmentリターンFrameLayoutはデフォルトで。

注:getView()一度onCreateView()正常に実行されると、フラグメントビューをクラスのどこにでも取得できます。すなわち

getView().findViewById("your view id");

4
多くの人がこのレスポンスに賛成していないことに驚いています-これはフラグメントにリスナーを設定する正しい方法です...おそらくこれはAPIの新しい開発でした。
Sonny

を使用viewすると、onViewCreated依然として原因になりますNullPointerExceptionが、使用しても問題ありませんgetActivity()。何かアイデアはありますか?
dVaffection 2015

@dVaffectionフラグメントのonCreateView()ライフサイクルメソッドでnull以外のビューを返さない可能性があります。getActivityの場合、フラグメントのメインビューではなく、アクティビティからビューを取得していますが、渡すIDによって異なります。onCreateViewからnull以外のビューを返すかどうかを確認してください。それから私に知らせてください。
Ankur Chaudhary 2015

@AnkurChaudhary onCreateViewメソッドからビューを返します。デバッグしたところ、レイアウトがあることがわかりました(私の場合FrameLayout)。それは私がそれが返す要素を見つけようとすると言われているnull。なぜそれが起こっているのですか?
dVaffection 2015

@dVaffectionでは、フラグメントのクラスと対応するレイアウトを共有してください。
Ankur Chaudhary 2015

66

これは古い質問であることに気づきましたが、一般的な答えは、まだ望まれていないことを残しています。

質問は何が必要なのか明確ではありません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;
    }
}

1
次に、ListFragmentからimageViewをどのように更新しますか?これにはFragmentManagerが必要ですか?つまり、個別のクラスのonListItemClickから詳細フラグメントのimageViewをどのように更新できますか?
whyoz 2013

1
必要なときにimageViewへの参照をどこかに保存するか、fragment.getView()。findViewById(R.id.my_image)を保存します。ListFragmentでは、画像がリストアイテム内にあると想定して、通常、アダプターのgetViewメソッドでリストビューアイテムのsetTag / getTagメソッドを使用して参照ホルダーを作成します。これを行う方法の例は多数あります。
MattJenko 2013年

47

最初にフラグメントビューを取得し、次にこのビューから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;
}

では、onCreateメソッドはFragmentで役立ちますか?
Tsunaze

onCreateViewは、フラグメントに関連付けられたビュー階層を作成して返します。onCreateは、フラグメントの初期作成を行うために呼び出されます。実際、それはこれらのメソッドで何を書くかに依存します。
xevincent

わかりましたが、どうすればonCreateで変数を宣言できますか?ビューがonCreateViewメソッド内にあるためです。
綱瀬

@Tsunazeは、onCreateメソッドからこれを行う方法を見つけたことがありますか?
StuStirling

1
同意する。この答えを解決策としてマークする必要があります。
ボリス・カーロフ

25

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);

可能です。



17

すべてのビューが拡張された直後に呼び出されるonViewCreated()をオーバーライドできます。これは、フラグメントのメンバー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);
    }
}

17

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);
    }
}

2
優秀でした!どうもありがとう
Vivek

15

メソッドgetView() OnCreateおよび類似のメソッドの外部のフラグメントでは機能しません。

2つの方法があります。ビューを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);
}

11

1)最初にFragmentのレイアウトをインフレートし、次にfindviewbyIdを使用できます。

View view = inflater.inflate(R.layout.testclassfragment, container, false);
             ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
             return view;

10
EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);  

9

使用する

imagebutton = (ImageButton) getActivity().findViewById(R.id.imagebutton1);

imageview = (ImageView) getActivity().findViewById(R.id.imageview1);

それが動作します


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;
}

9

注意 :

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
キャストすることなく説明したことは私を助けました。
shaurya uppal

8

APIレベル11のドキュメントによると

リファレンス、バックスタック 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;
}

8

を使用getView()すると、フラグメントのビューが返されます。次に、呼び出しfindViewById()て、フラグメントビューの任意のビュー要素にアクセスできます。


3
ビューはアクティビティではありません
スティーブM

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);
    }
}

はい、このコードはここで大丈夫です。他へのあなたの編集はそうではありません。
OneCricketeer 2017年

@ cricket_007分かりました
Bipin Bharti 2017

あなたの英語がよくわかりませんが、すべて修正されました。お見せするものはありません。
OneCricketeer 2017年

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
}

このようにして、xmlレイアウトで定義された各コントロールにrootViewを使用でき、コードはこのようにはるかにクリーンになります。

お役に立てれば :)


これは可能だと思ったが、うまくいかなかった
マイクブライアンオリベラ14

5

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);
}

4

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;
    }
}

ファイルでImageView宣言されていると仮定するmy_layout.xmlと、自動的にmyLayoutクラスが生成されます。


4

これを試して:

View v = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView img = (ImageView) v.findViewById(R.id.my_image);

return v;

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;
}

フィールドに理由はありません。いつでも呼び出すことができgetView()、後に
OneCricketeer

3

内部に取得findViewById()したアクティビティオブジェクトを使用して呼び出すことができます。public void onAttach(Activity activity)メソッド内でフラグメントます。

たとえば、アクティビティを変数に保存します。

ではフラグメントクラスprivate Activity mainActivity;onAttach()メソッド: this.mainActivity=activity;

最後に、vairableを介してすべてのfindViewByIdを実行します。 mainActivity.findViewById(R.id.TextView);


3

onViewCreatedと呼ばれるもう1つのメソッドがあります。

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ImageView imageView = (ImageView) view.findViewById(R.id.imageview1);
}

2

onCreateViewメソッドの内部

1)最初に、追加したいレイアウト/ビューを膨らませる必要があります。LinearLayout

LinearLayout ll = inflater.inflate(R.layout.testclassfragment, container, false);

2)次に、レイアウトからimageView IDを見つけることができます

ImageView imageView = (ImageView)ll.findViewById(R.id.my_image);

3)膨張したレイアウトを返す

return ll;

これはレフェルマニアの答えと同じです。
Reti43

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
}}

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;
        }
    }

1)これは他の答えに何を追加しますか?2)2回回答したようです
OneCricketeer

2

ここにレイアウトインフレーターが登場します。レイアウトインフレーターは、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;
    }
}

1

そのようなものを使用する最も簡単な方法は、バターナイフを使用することです。これにより、以下で説明するように、@ 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;
    }
}

なぜ反対票を投じたのか、これを使用すると、onステートメントでも複数のonclicksを使用できるようになります。
2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.