フラグメント内のコンテキストを取得する方法
私は自分のデータベースを使用する必要があります。コンストラクタはコンテキストを取りますが、getApplicationContext()
とFragmentClass.this
は動作しません。
データベースコンストラクタ
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
getActivity()
を使用すると、fragment
に関連付けられているアクティビティが返されます。
アクティビティはcontext
です(Activity
はContext
を拡張するため) 。
上記の答えのようにするには、fragmentのonAttach
メソッドをオーバーライドすることができます。
public static class DummySectionFragment extends Fragment{
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
DBHelper = new DatabaseHelper(activity);
}
}
常に getActivity() メソッドを使用して、アタッチされたアクティビティのコンテキストを取得しますが、常に1つのことを覚えておいてください。フラグメントは少し不安定で、getActivity
nullを何度か返すため、そのためには、getActivity()
によってコンテキストを取得する前に、常にフラグメントの isAdded() メソッドを確認してください。
私が見つけたフラグメントのコンテキストを取得するための最も簡単で最も正確な方法は、少なくともここでViewGroup
メソッドを呼び出すときにonCreateView
から直接取得することです。getActivity()
に対してnullを取得しないことは確実です。
public class Animal extends Fragment {
Context thiscontext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
thiscontext = container.getContext();
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
context=activity;
}
フラグメント内のコンテキストを取得するには、 getActivity()
を使用します。
public Database()
{
this.context = getActivity();
DBHelper = new DatabaseHelper(this.context);
}
getActivity()
を使用してフラグメントに関連付けられたActivity
を取得するには注意してください。使用することはできますが、メモリリークの原因となることはお勧めできません。私はもっと良いアプローチがonAttach()
メソッドからActivity
を取得することであるべきだと思います:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
context = activity;
}
他の代替アプローチは:
あなたは文脈を得ることができます:
getActivity().getApplicationContext();
APIレベル23以降ではgetContext()
がありますが、古いバージョンをサポートしたい場合はgetActivity().getApplicationContext()
を使用できますが、それでもAndroid.support.v4.app.Fragment
であるFragment
のサポートバージョンの使用をお勧めします。
getContext()
はAPI 23で登場しました。コードのいたるところでgetActivity()に置き換えてください。
それがエラーを修正するかどうか確認してください。ターゲットレベルと最小APIレベルの間にあるメソッドを使用してみてください。そうしないと、このエラーが発生します。
以前はcontext
でFragment
を取得するためにonAttach (Activity activity)
を使用していました
問題
onAttach (Activity activity)
メソッドはAPIレベル23では推奨されませんでした。
溶液
Fragment
でコンテキストを取得するために、 onAttach (Context context)
を使用できます。
onAttach (Context context)
context
に最初にアタッチされたときに呼び出されます。この後onCreate(Bundle)
が呼び出されます。ドキュメンテーション
/**
* Called when a fragment is first attached to its context.
* {@link #onCreate(Bundle)} will be called after this.
*/
@CallSuper
public void onAttach(Context context) {
mCalled = true;
final Activity hostActivity = mHost == null ? null : mHost.getActivity();
if (hostActivity != null) {
mCalled = false;
onAttach(hostActivity);
}
}
サンプルコード
public class FirstFragment extends Fragment {
private Context mContext;
public FirstFragment() {
// Required empty public constructor
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext=context;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rooView=inflater.inflate(R.layout.fragment_first, container, false);
Toast.makeText(mContext, "THIS IS SAMPLE TOAST", Toast.LENGTH_SHORT).show();
// Inflate the layout for this fragment
return rooView;
}
}
getActivity()
を使用してcontext
にFragments
を取得することもできますが、null
が現在親fragment
にアタッチされていない場合、getActivity()
はactivity
を返すことができます
inflater
をオーバーライドするときは、onCreateView
パラメータからコンテキストを取得することもできます。
public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/* ... */
Context context = inflater.getContext();
/* ... */
}
}
からのフラグメントを使用する - サポートライブラリ -
Android.support.v4.app.Fragment
そしてオーバーライド
void onAttach (Context context) {
this.context = context;
}
これにより、コンテキストが常にnull以外の値になることを確認できます。
あなたはさまざまなオプションがあります。
Context
なのでgetActivity()
を使用できます。getContext()
を使用できます。古いバージョンをサポートする必要がない場合はgetContext()
を付けてください。
getActivity()
はContextの子ですので、それはあなたのために働くはずです
Kotlinの場合は、context
を直接フラグメントで使用できます。しかし、場合によっては、次のようなエラーが表示されます。
型が一致しません:推定型はContextですか?しかし文脈は期待されていた
そのためにあなたはこれを行うことができます
val ctx = context ?: return
textViewABC.setTextColor(ContextCompat.getColor(ctx, Android.R.color.black))
getActivity()
を呼び出すことができます
public void onAttach(Context context) {
super.onAttach(context);
this.activity = (CashActivity) context;
this.money = this.activity.money;
}
理想的には、グローバルを使う必要はないはずです。このフラグメントにはさまざまな通知があり、そのうちの1つはonActivityCreatedです。フラグメントのこのライフサイクルイベントでアクティビティのインスタンスを取得できます。
それから:あなたが望むようにアクティビティ、コンテキストまたはアプリケーションコンテキストを得るためにフラグメントを間接参照することができます:
this.getActivity()
はアクティビティへのハンドルを提供しますthis.getContext()
はコンテキストへのハンドルを提供しますthis.getActivity().getApplicationContext()
はアプリケーションコンテキストへのハンドルを提供します。データベースに渡すときは、アプリケーションコンテキストを使用することをお勧めします。
簡単な方法はgetActivity()
を使うことです。しかし、ここでコンテキストを取得するためにgetActivity()
メソッドを使用することの主な混乱は、nullポインタ例外です。
これについては、まずisAdded()
メソッドをチェックして、それが追加されているかどうかを判断します。次に、getActivity()
を使用してActivityのコンテキストを取得します。
あなたにフラグメント
((Name_of_your_Activity) getActivity()).helper
活動について
DbHelper helper = new DbHelper(this);
私は getActivityを使用していたとき/ arrayAdapter INフラグメントを使用するためのコンテキストが必要です エラーが発生しますが、私はそれを getContextに置き換える それは私のために動作します
listView LV=getView().findViewById(R.id.listOFsensors);
LV.setAdapter(new ArrayAdapter<String>(getContext(),Android.R.layout.simple_list_item_1 ,listSensorType));
kotlin ではgetActivity()
の代わりにactivity
を使う
私はあなたが使用できると思います
public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Context context = getActivity.getContext();
}
}
getContext() メソッドは、フラグメントアクティビティでクラスのコンテキストを使用するのに役立ちます。
getActivity()
またはgetContext
を使用できます。ドキュメンテーション
/**
* Return the {@link FragmentActivity} this fragment is currently associated with.
* May return {@code null} if the fragment is associated with a {@link Context}
* instead.
*
* @see #requireActivity()
*/
@Nullable
final public FragmentActivity getActivity() {
return mHost == null ? null : (FragmentActivity) mHost.getActivity();
}
そして
/**
* Return the {@link Context} this fragment is currently associated with.
*
* @see #requireContext()
*/
@Nullable
public Context getContext() {
return mHost == null ? null : mHost.getContext();
}
常にチェックしてくださいif(getActivity!=null)
なぜなら nullになることがあります fragmentがアクティビティに添付されていない場合。断片的に長い操作(残りのapiからデータを取得するなど)を行うと、時間がかかることがあります。ユーザーが別のフラグメントに移動した場合。その場合、getActivityはnullになります。あなたがそれを取り扱わなかったならば、あなたはNPEを得るでしょう。
また使用することができます:
inflater.getContext();
しかし私は使いたい
getActivity()
または
getContext
public class MenuFragment extends Fragment implements View.OnClickListener {
private Context mContext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
FragmentMenuBinding binding=FragmentMenuBinding.inflate(inflater,container,false);
View view=binding.getRoot();
mContext=view.getContext();
return view;
}
}