web-dev-qa-db-ja.com

フラグメント内でコンテンツを使用する

フラグメント内のコンテキストを取得する方法

私は自分のデータベースを使用する必要があります。コンストラクタはコンテキストを取りますが、getApplicationContext()FragmentClass.thisは動作しません。

データベースコンストラクタ

public Database(Context ctx)
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}
613
tyczj

getActivity() を使用すると、fragmentに関連付けられているアクティビティが返されます。
アクティビティはcontext です(ActivityContextを拡張するため)

1223
user658042

上記の答えのようにするには、fragmentのonAttachメソッドをオーバーライドすることができます。

public static class DummySectionFragment extends Fragment{
...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        DBHelper = new DatabaseHelper(activity);
    }
}
127
iambox

常に getActivity() メソッドを使用して、アタッチされたアクティビティのコンテキストを取得しますが、常に1つのことを覚えておいてください。フラグメントは少し不安定で、getActivity nullを何度か返すため、そのためには、getActivity()によってコンテキストを取得する前に、常にフラグメントの isAdded() メソッドを確認してください。

24
Ankur Chaudhary

私が見つけたフラグメントのコンテキストを取得するための最も簡単で最も正確な方法は、少なくともここでViewGroupメソッドを呼び出すときにonCreateViewから直接取得することです。getActivity()に対してnullを取得しないことは確実です。

public class Animal extends Fragment { 
  Context thiscontext;
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  {
    thiscontext = container.getContext();
16
Amerdroid
@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);
    context=activity;
}
9
taran mahal

フラグメント内のコンテキストを取得するには、 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;
}
5
Elenasys

他の代替アプローチは:

あなたは文脈を得ることができます:

getActivity().getApplicationContext();
4
codercat

APIレベル23以降ではgetContext()がありますが、古いバージョンをサポートしたい場合はgetActivity().getApplicationContext()を使用できますが、それでもAndroid.support.v4.app.FragmentであるFragmentのサポートバージョンの使用をお勧めします。

3
Androbin

getContext()はAPI 23で登場しました。コードのいたるところでgetActivity()に置き換えてください。

それがエラーを修正するかどうか確認してください。ターゲットレベルと最小APIレベルの間にあるメソッドを使用してみてください。そうしないと、このエラーが発生します。

3
Naveen

以前はcontextFragmentを取得するために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()を使用してcontextFragmentsを取得することもできますが、nullが現在親fragmentにアタッチされていない場合、getActivity()activityを返すことができます

3
Nilesh Rathod

inflaterをオーバーライドするときは、onCreateViewパラメータからコンテキストを取得することもできます。

public static class MyFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
        /* ... */
        Context context = inflater.getContext();
        /* ... */
    }
}
3
luizfls

からのフラグメントを使用する - サポートライブラリ -

Android.support.v4.app.Fragment

そしてオーバーライド

void onAttach (Context context) {
  this.context = context;
}

これにより、コンテキストが常にnull以外の値になることを確認できます。

2
lomza

あなたはさまざまなオプションがあります。

  • MinSDK <= 21の場合、これはContextなのでgetActivity()を使用できます。
  • MinSDKが23以上の場合は、getContext()を使用できます。

古いバージョンをサポートする必要がない場合はgetContext()を付けてください。

2
Jorge

getActivity()はContextの子ですので、それはあなたのために働くはずです

2
qazimusab

Kotlinの場合は、contextを直接フラグメントで使用できます。しかし、場合によっては、次のようなエラーが表示されます。

型が一致しません:推定型はContextですか?しかし文脈は期待されていた

そのためにあなたはこれを行うことができます

val ctx = context ?: return
textViewABC.setTextColor(ContextCompat.getColor(ctx, Android.R.color.black))
2

getActivity()を呼び出すことができます

public void onAttach(Context context) {
    super.onAttach(context);
    this.activity = (CashActivity) context;
    this.money = this.activity.money;
}
1
蔡健烽

理想的には、グローバルを使う必要はないはずです。このフラグメントにはさまざまな通知があり、そのうちの1つはonActivityCreatedです。フラグメントのこのライフサイクルイベントでアクティビティのインスタンスを取得できます。

それから:あなたが望むようにアクティビティ、コンテキストまたはアプリケーションコンテキストを得るためにフラグメントを間接参照することができます:

this.getActivity()はアクティビティへのハンドルを提供しますthis.getContext()はコンテキストへのハンドルを提供しますthis.getActivity().getApplicationContext()はアプリケーションコンテキストへのハンドルを提供します。データベースに渡すときは、アプリケーションコンテキストを使用することをお勧めします。

1
user5610809

簡単な方法はgetActivity()を使うことです。しかし、ここでコンテキストを取得するためにgetActivity()メソッドを使用することの主な混乱は、nullポインタ例外です。

これについては、まずisAdded()メソッドをチェックして、それが追加されているかどうかを判断します。次に、getActivity()を使用してActivityのコンテキストを取得します。

あなたにフラグメント

((Name_of_your_Activity) getActivity()).helper

活動について

DbHelper helper = new DbHelper(this);
0
Kinggeov

私は 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));
0

kotlin ではgetActivity()の代わりにactivityを使う

0
Abduhafiz

私はあなたが使用できると思います

public static class MyFragment extends Fragment {
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

      Context context = getActivity.getContext();

  }
}
0
aswinbhim nath

getContext() メソッドは、フラグメントアクティビティでクラスのコンテキストを使用するのに役立ちます。

0
Gavine Joyce

Fragmentでは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を得るでしょう。

0
Khemraj

また使用することができます:

inflater.getContext();

しかし私は使いたい

getActivity()

または

getContext
0
Deplover
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;
    }
}
0
Mohsinali