2016-10-12 5 views
-1

La structure de mon projet suit: Activité - Fragment - ClasseComment appeler un toast dans la classe?

La question: en classe, selon certaines conditions montrent un toast

Le problème: Je ne peux pas appeler un contexte de la classe par getActivity()

Comment le résoudre de la meilleure façon? Créer une classe publique ou une variable?

+1

Votre question est extrêmement vague, je recommande d'examiner la façon de créer un [mcve]. – Bryan

+0

J'ai besoin d'appeler le Toast de la classe (TextWatcher) - ce n'est pas une vague vague – tadvas

+1

Avez-vous lu le lien? Je pense que vous devriez lire [comment poser une bonne question] (http://stackoverflow.com/help/how-to-ask). Vous ne fournissez aucune information sur la manière dont vous avez tenté de résoudre votre problème, et vous n'avez pas non plus fourni de code pour reproduire le problème. C'est * une * question vague, et fournir plus d'informations nous aidera à vous aider. – Bryan

Répondre

0

Envoyez simplement le Context à votre constructeur de classe. Comme ceci:

private Context context; 

public MyClass(Context ctx) { 
context = ctx; 
} 

Et puis l'utiliser pour montrer un toast.

+0

Passer un 'contexte 'sans connaître le cas d'utilisation est un bon moyen de [provoquer des fuites de mémoire] (http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html) dans votre application. – Bryan

+0

@Brian On peut utiliser 'WeakReference' alors. –

+0

C'est une façon de le faire, mais pas nécessaire pour * chaque * cas d'utilisation. Ce que j'étais, j'étais hésitant à poster une réponse basée sur une si petite information. – Bryan

0

Vous pouvez appeler Toast en classe d'activité comme suit: -

Context context = getApplicationContext(); 
CharSequence text = "Hello toast!"; 
int duration = Toast.LENGTH_SHORT; 

Toast toast = Toast.makeText(context, text, duration); 
toast.show(); 

Pour afficher dans Fragment ou d'une autre classe, vous devez passer la référence de l'activité ou le contexte dans le constructeur de Fragment ou cette catégorie particulière. Par exemple,

Fragment fragment = new Fragment(activity); 

Dans Fragment classe -

Class MyFragment extends Fragment{ 
    private Activity mActivity; 

    MyFragment(Activity activity){ 
     mActivity = activity; 
    } 

    void showToast(){ 
     Toast.makeText(mActivity, text, duration); 
    } 

} 
1

Witho ut bien contexte, la seule façon que je peux recommander le déclenchement d'un message Toast d'une classe autre qu'un Activity est d'utiliser une interface Listener: dans votre Activity, en veillant à éliminer

public class Unknown { 

    public interface UnknownListener { 

     void displayMessage(CharSequence message); 

    } 

    private UnknownListener mUnknownListener; 

    private final String mToastMessage = "Unknown message"; 

    public Unknown() {} 

    public void setUnknownListener(UnknownListener listener) { 
     mUnknownListener = listener; 
    } 

    private void doSomething() { 
     if(mUnknownListener != null) { 
      mUnknownListener.displayMessage(mToastMessage); 
     } 
    } 

} 

mettre en œuvre ensuite l'interface la référence en une méthode de cycle de vie correspondant:

public class MainActivity extends AppCompatActivity implements Unknown.UnknownListener { 

    private Unknown mUnknown; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mUnknown = new Unknown(); 
     mUnknown.setUnknownListener(this); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     mUnknown.setUnknownListener(null); 
    } 

    @Override 
    public void displayMessage(CharSequence message) { 
     Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); 
    } 

} 
+0

merci pour votre réponse. Peut-être que c'est la solution la plus appropriée, mais je préfère aller par le plus simple en appelant le constructeur. Cependant, merci. – tadvas