web-dev-qa-db-ja.com

アプリケーションオブジェクトをフラグメントクラスに取得する方法

私はAndroidタブレットと携帯電話の両方をサポートするモバイルアプリを変更しています。このために、アクティビティクラスをフラグメントに変更しています。アクティビティクラスでは、次のように作成されたアプリケーションクラスのインスタンス:

appCtx = (UnityMobileApp) getApplication();

ここで、UnityMobileAppは私のアプリケーションクラスです。

次に、フラグメントクラスに同じインスタンスを作成します。これを解決するのを手伝ってもらえますか?

44

フラグメントでappCtx = (UnityMobileApp) getActivity().getApplication();を使用します。

110
biegleux

メソッドgetActivity()は、nullを返す可能性があります。これによりアプリがクラッシュする可能性があります。そのため、onActivityCreated()内でそのメソッドを使用しても安全です。例えば:

private UnityMobileApp appCtx;
.
.
...
@Override
public View onCreateView(...){
...
}

@Override public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     appCtx = ((UnityMobileApp) getActivity().getApplication()); 
} 
...
//access the application class methods using the object appCtx....

この回答は、Ognyanがコメントで尋ねたDzianis Yafimaの回答に由来しています。したがって、クレジットはDzianis Yafima'sおよびOgnyanになります。

2
BharathRao

または、Kotlinを使用する

fun bar() {
   (activity?.application as UnityMobileApp).let {
      it.drink()
   } ?: run {
      Log.d("DEBUG", "(╯°□°)╯︵ ┻━┻")
   }
}
0
Alex Nolasco

フラグメントからアプリケーションコンテキストを使用しようとしているので、getApplication()は使用できません。これは、フラグメントクラスのメソッドではないためです。
そのため、最初にフラグメントが現在関連付けられているフラグメントアクティビティを返すgetActivity()を使用する必要があります。

コードをまとめると、

this.getApplication()の代わりにgetActivity.getApplication()を使用する必要があります

Androidドキュメント からgetActivity()の詳細を知る

0
Irony Stack