1
votes

Comment utiliser une méthode d'activité dans une classe sans activité? Mon programme plante lorsque j'essaye d'utiliser un contexte

J'essaye d'utiliser la méthode openFileOutput dans une classe de non-activité. Lorsque j'essaye d'utiliser un contexte, à partir de MainActivity (this), le programme plante.

Une forme pour utiliser cette méthode dans ma classe?

public CellOptions(final Dialog dialog) {

final Events event = new Events(dialog.getContext());       
final TextView newEvent = (TextView) dialog.findViewById(R.id.newEvent), eventView = (TextView) dialog.findViewById(R.id.eventView);

newEvent.setOnClickListener(new View.OnClickListener() {
    public void onClick(View option) {
        event.setEvent(2018, 0, 1, 0, 0, "New year", "Nothing");

        eventView.setBackgroundColor(Color.rgb(0, 0, 8));
    }
});
}

public boolean showed() {
    return true;
}

J'ai une boîte de dialogue personnalisée, elle est utilisée pour appeler la méthode setEvent.

private Context context;

public Events(Context context) {
    this.context = context;
}

public void setEvent(int year, int month, int dayNumber, int hour, int minutes, String event, String eventParameters) {
    try {
        OutputStreamWriter events = new OutputStreamWriter(context.openFileOutput("events.txt", Context.MODE_PRIVATE));         

    } catch(IOException e) {
        e.printStackTrace();
    } // End of try  
} // End of method - setEvent

Moi aussi, j'ai essayé pour utiliser setEvent dans la classe MainActivity à partir du formulaire suivant.

Events event = new Events (ceci, les paramètres suivants);

Mais ce n'est pas travail.

J'ai cherché des réponses à ce problème, mais je ne trouve pas de solution qui m'aide.

J'ai trouvé ces pages, mais le même problème persiste. p >

comment appeler la méthode sous forme d'activité non classe d'activités

Obtenir une activité à partir du contexte dans Android

en utilisant openFileOutput () dans un classe. (pas une activité)

http://www.sgoliver.net/blog/ficheros-en-android-i-memoria-interna/

Lorsque j'exécute mon programme, il plante lorsqu'il utilise le contexte.

Logcat montre ceci:

01-03 15: 55: 25.932: W / Binder (632): A intercepté une exception RuntimeException de l'implémentation du stub de classeur. 01-03 15: 55: 25.932: Avec classeur (632): java.lang.NullPointerException 01-03 15: 55: 25.932: W / Binder (632): à android.inputmethodservice.IInputMethodWrapper.setSessionEnabled (IInputMethodWrapper.java:280) 01-03 15: 55: 25.932: W / Binder (632): à com.android.internal.view.IInputMethod $ Stub.onTransact (IInputMethod.java:129) 01-03 15: 55: 25.932: W / Binder (632): à android.os.Binder.execTransact (Binder.java:404) 01-03 15: 55: 25.932: W / Binder (632): at dalvik.system.NativeStart.run (Méthode native) 01-03 15: 55: 25.932: W / InputMethodManagerService (487): Obtention de RemoteException envoyant une notification setActive (false) à pid 2744 uid 10036 01-03 15: 55: 26.572: I / ActivityManager (487): affiché com.android.dropcalendary / .MainActivity: + 4s402ms


5 commentaires

Veuillez inclure le logcat pour donner plus de détails sur le crash.


Cela semble moins vraisemblablement un problème "d'appeler une méthode Activity à partir d'une classe non Activity" ... Jetez un œil dans le logcat ou collez-le ici pour fournir des informations plus détaillées.


Avez-vous besoin d'une partie spécifique de logcat ou de toutes les informations de logcat?


Seul le stacktrace de l'exception fera l'affaire.


Je mets l'avertissement de logcat, avec des exceptions qui montrent le logcat, c'est ok?


3 Réponses :


1
votes

Vous utilisez la méthode d'activité dans une classe sans activité? L'histoire courte est, Vous ne pouvez pas

Mais il y a certainement un moyen pour cela, vous pouvez transmettre votre activité (ce qui n'est généralement pas une bonne idée, si votre activité est détruite, cela peut provoquer un pointeur nul ou une fuite de mémoire).

Une autre façon est que si vous avez besoin du contexte, vous pouvez utiliser ApplicationContext pour cela.


2 commentaires

D'accord, merci pour la réponse. Et, si je souhaite utiliser une méthode à partir d'une activité, dois-je étendre comme activité même si une autre activité est ouverte?


Oui, vous devez le faire si vous souhaitez appeler cette méthode dans la classe



0
votes

Utilisez ApplicationContext au lieu du contexte. Étant donné que le cycle de vie de ce contexte est conservé jusqu'à ce que l'application soit détruite ou terminée. Le contexte n'est donc conservé que jusqu'à la destruction de l'activité.

getApplicationContext();      


1 commentaires

Lorsqu'une boîte de dialogue est ouverte, l'activité se maintient? getApplicationContext (); pour cette instruction dois-je utiliser un objet Activity?



0
votes

J'ai réussi à résoudre le problème.

La méthode fonctionne dans une activité, pour utiliser la méthode dans une classe sans activité, j'ai utilisé:

getApplicationContext ();

Je l'ai utilisé, en envoyant le contexte depuis MainActivity, via la classe CellOptions, et dans la classe CellOptions j'ai envoyé le même contexte.

MainActivity: p >

context.openFileOutput(events.txt);

Classe CellOptions (contexte = contexte d'application):

Events event = new Events(context);

Classe d'événements:

new CellOptions(cellOptions, getApplicationContext());


0 commentaires