web-dev-qa-db-ger.com

So erhalten Sie ein Anwendungsobjekt in die Fragmentklasse

Ich ändere meine Android-Handy-App, um sowohl Tablets als auch Mobiltelefone zu unterstützen. Dafür verwandle ich meine Aktivitätsklasse in Fragment. In meiner Aktivitätsklasse habe ich eine Instanz meiner Anwendungsklasse wie folgt erstellt:

appCtx = (UnityMobileApp) getApplication();

Dabei ist UnityMobileApp meine Anwendungsklasse.

Jetzt möchte ich dieselbe Instanz in meiner Fragment-Klasse erstellen. Können Sie mir bitte helfen, das zu lösen?

40

Verwenden Sie appCtx = (UnityMobileApp) getActivity().getApplication(); in Ihrem Fragment.

97
biegleux

Die Methode getActivity() hat möglicherweise die Möglichkeit, null zurückzugeben. Dies kann Ihre App zum Absturz bringen. Daher ist es sicher, diese Methode in der onActivityCreated() zu verwenden. Z.B:

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....

Diese Antwort leitet sich von Dzianis Yafimas Antwort ab, die Ognyan in Kommentaren gefragt hat. So geht der Kredit an Dzianis Yafimas und Ognyan im Stackoverflow.

1
BharathRao

Alternativ mit Kotlin

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

Wenn Sie versuchen, den Anwendungskontext aus Fragment zu verwenden, können Sie getApplication() nicht verwenden, da dies keine Methode der Fragment-Klasse ist
Sie müssen also zuerst die getActivity() verwenden, die eine Fragmentaktivität zurückgibt, der das Fragment aktuell zugeordnet ist. 

in ihrem Code zusammenzufassen, 

anstelle von this.getApplication() müssen Sie getActivity.getApplication() verwenden.

erfahren Sie mehr über getActivity() von Android-Dokumentation

0
Irony Stack