フラグメント用に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
メソッドにはエラーがあり、メソッドが未定義であることを示しています。
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()
メソッド内では使えません .
フラグメントのビューを膨らませて、それが返す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;
}
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");
私はこれが古い質問であることを認識していますが、一般的な答えはまだ何か望ましいことを残しています。
質問は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);
可能です。
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以外のフラグメントや同様の方法では動作しません。
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);
}
EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);
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;
}
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);
}
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;
}
getView()
を使用するとフラグメントのビューが返されるので、findViewById()
を呼び出してフラグメントビュー内の任意のビュー要素にアクセスできます。
つかいます
imagebutton = (ImageButton) getActivity().findViewById(R.id.imagebutton1);
imageview = (ImageView) getActivity().findViewById(R.id.imageview1);
それが動作します
注意 :
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;
}
これを試してみてくださいそれは私のために働く
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);
}
}
OnViewCreatedというメソッドがもう1つあります。
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ImageView imageView = (ImageView) view.findViewById(R.id.imageview1);
}
やってみる
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;
}
これを実装する最良の方法は次のとおりです。
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レイアウトで定義された各コントロールに使用でき、コードはこのようにしてはるかにきれいになります。
お役に立てれば :)
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クラスが生成されます。
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);
}
}
これを試して:
View v = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView img = (ImageView) v.findViewById(R.id.my_image);
return v;
Activityオブジェクト - でfindViewById()
を呼び出すことができます あなたはあなたのFragmentの中のあなたのpublic void onAttach(Activity activity)
メソッドの中に入ります。
アクティビティを変数に保存します。
フラグメントクラス : private Activity mainActivity;
onAttach()
メソッド内: this.mainActivity=activity;
最後にvairableを介してすべてのfindViewByIdを実行します。 mainActivity.findViewById(R.id.TextView);
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;
ここにレイアウトインフレータが登場します。レイアウトインフレータは、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;
}
}
ビューを膨らませる必要があります
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;
}
}
そのようなものを使う最も簡単な方法は、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;
}
}
getView()
は - onCreateView()
が完了した後にのみ機能するので、onPostCreate()
から呼び出します
@Override
public void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
}
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
が発生する可能性があります。