web-dev-qa-db-ja.com

フラグメント内のfindViewById

フラグメント用に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メソッドにはエラーがあり、メソッドが未定義であることを示しています。

899
simplified.

onViewCreatedメソッドを実装するには、 getView() または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()メソッド内では使えません .

1307
advantej

フラグメントのビューを膨らませて、それが返すViewに対して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;
}
577
LeffelMania

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

フラグメントの場合、onViewCreated()メソッドからnullまたはsuper.onCreateView()メソッドを返す場合、onCreateView()メソッドは自動的に呼び出されないことを常に覚えておいてください。 ListFragmentの場合、デフォルトでListFragmentが返されるFrameLayoutとしてデフォルトで呼び出されます。

注:getView()が正常に実行されると、onCreateView()を使用して、クラス内の任意の場所でフラグメントビューを取得できます。つまり.

getView().findViewById("your view id");
124
Ankur Chaudhary

私はこれが古い質問であることを認識していますが、一般的な答えはまだ何か望ましいことを残しています。

質問は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;
    }
}
65
MattJenko

まずフラグメントビューを取得してから、このビューから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;
}
42
xevincent

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

可能です。

22
friiky

getView()はルートビューを与えます

View v = getView().findViewByID(R.id.x); 
18
dreamdeveloper

すべてのビューが膨張した直後に呼び出される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);
    }
}
17
Lez

メソッド 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);
}
14
sagits
EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);  
10
sandhu

1)最初にFragmentのレイアウトを膨らませてからfindviewbyIdを使用できます。

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

ビューで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
Pajeh

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);
}
8
Nanda Gopal

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
Dexter

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

8
Mahmoud Badri

つかいます 

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

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

それが動作します

8
Manoj ahirwar

注意 :

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;
}
8
Novo Lucas

これを試してみてくださいそれは私のために働く 

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

OnViewCreatedというメソッドがもう1つあります。

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

やってみる

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;
}
5
Ramkumar.M

これを実装する最良の方法は次のとおりです。 

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レイアウトで定義された各コントロールに使用でき、コードはこのようにしてはるかにきれいになります。

お役に立てれば :)

5

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クラスが生成されます。

4
Ilya Gazman

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);
    }
}
4
Vipul Prajapati

これを試して:

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

return v;
4
AbhayBohra

Activityオブジェクト - でfindViewById()を呼び出すことができます あなたはあなたのFragmentの中のあなたのpublic void onAttach(Activity activity)メソッドの中に入ります。

アクティビティを変数に保存します。

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

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

3
mrSurprise

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

ここにレイアウトインフレータが登場します。レイアウトインフレータは、JavaコードでXMLビューを使用できるようにするクラスです。そのため、次のコードを使用して、変数xのルート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;
    }
}
2
Wijay Sharma

ビューを膨らませる必要があります

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
Surajit Mondal

フラグメントでは、このフラグメントの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;
        }
    }
0
Mayank Garg

そのようなものを使う最も簡単な方法は、butterknife を使うことです。これによって、以下で説明されるように、@ 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;
    }
}
0
Amit

getView() - onCreateView()が完了した後にのみ機能するので、onPostCreate()から呼び出します

@Override
public void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
}
0
SwiftArchitect
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()メソッドを使用すると、rootviewを返し、onCreateView()メソッドの後のビューになるため、nullPointerExceptionが発生する可能性があります。

0
Mahdi-Malv