回答:
にgetActivity()
関連付けられているアクティビティを返すを使用できますfragment
。
アクティビティはcontext
(Activity
拡張以降Context
)です。
getActivity().getApplicationContext()
フラグメントの作成時にインスタンス変数にの値を格納し、フラグメントクラス内で必要なときにいつでもそのコンテキストを使用することです。そのコンテキストは、フラグメントの切り離しを切り抜けます。
getActivity
いつでも利用できます。それはだgetContext
API 23に追加された
上記の答えとして、onAttach
フラグメントのメソッドをオーバーライドできます:
public static class DummySectionFragment extends Fragment{
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
DBHelper = new DatabaseHelper(activity);
}
}
DatabaseHelper
必要な場合、FragmentActivity
代わりにActivity
?たとえば、Adapter
...
onAttach(Activity activity)
場合は、リリースする必要がありますonDetach()
onAttach
方法は廃止されましたOverrides deprecated method in 'android.support.v4.app.Fragment'
常にgetActivity()メソッドを使用して、アタッチされたアクティビティのコンテキストを取得しますが、常に1つのことを覚えておいてください。フラグメントは少し不安定で、getActivity
null を返すことがあるので、そのため、によってコンテキストを取得する前に、フラグメントのisAdded()メソッドを常に確認してくださいgetActivity()
。
私が見つけたフラグメントのコンテキストを取得する最も簡単で最も正確な方法は、少なくともここでメソッドViewGroup
を呼び出すときにそれから直接取得することonCreateView
ですgetActivity()
。
public class Animal extends Fragment {
Context thiscontext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
thiscontext = container.getContext();
以前、私はonAttach (Activity activity)
入るのcontext
に使っていましたFragment
問題
この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
はなくgetActivity()
戻ることができnull
、あなたがあれば fragment
、現在の親に接続されていませんactivity
、
Fragment内のコンテキストを取得するには、以下を使用しgetActivity()
ます。
public Database()
{
this.context = getActivity();
DBHelper = new DatabaseHelper(this.context);
}
Activity
使用してフラグメントに関連付けられるようにするにはgetActivity()
、それを使用できますが、メモリリークが発生するため、お勧めしません。より良いアプローチActivity
はonAttach()
メソッドから取得する必要があると思います:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
context = activity;
}
Activity.findViewById
、そのアクティビティの登録済みコンテンツビュー(で設定setContentView
)でビューを検索するための便利な方法にすぎません。正しい例ではView.findViewById
、ではなくActivity.findViewById
を呼び出しており、正しいルートビューでメソッドを呼び出しています。まったく異なる問題であり、そのビューを保持していないビュー階層ではビューを見つけることができません。
Kotlinの場合context
、フラグメントで直接使用できます。しかし、いくつかのケースでは、次のようなエラーが見つかります
タイプの不一致:推論されたタイプはコンテキストですか?コンテキストが期待されていました
そのためにこれを行うことができます
val ctx = context ?: return
textViewABC.setTextColor(ContextCompat.getColor(ctx, android.R.color.black))
KotlinのAPI 29+では、私はしなければなりませんでした
activity?.applicationContext!!
例は
ContextCompat.getColor(activity?.applicationContext!!, R.color.colorAccent),
理想的には、グローバルを使用する必要はありません。フラグメントにはさまざまな通知があり、そのうちの1つはonActivityCreatedです。フラグメントのこのライフサイクルイベントでアクティビティのインスタンスを取得できます。
次に、フラグメントを逆参照して、必要に応じてアクティビティ、コンテキスト、またはアプリケーションコンテキストを取得できます。
this.getActivity()
アクティビティへの
this.getContext()
ハンドルを提供し、コンテキスト
this.getActivity().getApplicationContext()
へのハンドルを提供し、アプリケーションコンテキストへのハンドルを提供します。データベースに渡す場合は、アプリケーションコンテキストを使用することをお勧めします。
簡単な方法はを使用することgetActivity()
です。しかしgetActivity()
、ここでコンテキストを取得するためにメソッドを使用する際の大きな混乱は、nullポインタ例外だと思います。
そのためには、まず、isAdded()
それが追加されているかどうかを判断するメソッドを確認し、次にを使用しgetActivity()
てActivityのコンテキストを取得します。
getActivity()メソッドを使用してコンテキストを取得するか、getContext()メソッドを使用できます。
View root = inflater.inflate(R.layout.fragment_slideshow, container, false);
Context c = root.getContext();
お役に立てば幸いです。
使えると思います
public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Context context = 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;
}
}
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();
}
フラグメントがアクティビティに関連付けられていない場合はnullになる可能性があるif(getActivity!=null)
ため、常に確認してください。フラグメントで長い操作を実行する場合(rest APIからデータをフェッチする場合など)は、時間がかかる場合があります。ユーザーが別のフラグメントに移動した場合。その後、getActivityはnullになります。そして、それを処理しなかった場合は、NPEを取得します。
FragmentHostCallback
クラスのインスタンスです。
kotlinサンプルの内部フラグメントは誰かを助けるでしょう
textViewStatus.setTextColor(ContextCompat.getColor(context!!, R.color.red))
データバインディングを使用する場合。
bindingView.textViewStatus.setTextColor(ContextCompat.getColor(context!!, R.color.red))
bindingViewがで初期化されている場合onCreateViewこのよう
private lateinit var bindingView: FragmentBookingHistoryDetailBinding
bindingView = DataBindingUtil.inflate(inflater, R.layout.your_layout_xml, container, false)
requireContext()メソッドは最も簡単なオプションです
requireContext()
例
MyDatabase(requireContext())