2016-07-05 23 views
2

Ich möchte den Code für alertDialog wiederverwenden und es in eine andere Java-Datei als Funktionsaufruf. Aber "this" kann nicht verwendet werden, um die "MyActivity.this" zu ersetzen? Wie man es als Parameter übergibt? Am besten, wenn der Code generisch ist.wie android alertdialog wiederverwenden

AlertDialog alertDialog = new AlertDialog.Builder(MyActivity.this).create(); 
      alertDialog.setTitle("Alert"); 
      alertDialog.setMessage("Alert message to be shown"); 
      alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
        } 
       }); 
      alertDialog.show(); 
+0

Es ist ein Kontext, Sie können einen Kontext senden, um ihn wiederzuverwenden: newAlertDialog.Builder (context) .create() –

+0

Warum kann ich getapplicationContext() nicht verwenden, da dies generischer sein wird, als MyActivity.this zu verwenden in jeder Java/Projektdatei geändert werden. – DriveCarefully

Antwort

2

Sie so etwas wie dies in einer separaten Klasse verwenden können, zum Beispiel ich AlertUtils.java verwendet haben:

public class AlertUtils 
{ 
    public static void showOKDialog(Context context, String title, String message) 
    { 
     AlertDialog.Builder builder = new AlertDialog.Builder(context); 
     builder.setTitle(title); 
     builder.setMessage(message); 
     builder.setPositiveButton(android.R.string.ok, null); 
     builder.show(); 
    } 
} 

Bei dieser Methode übergeben die Context Sie durch diese Ihre Aktivität ist sein könnte, zum Beispiel: MyActivity.this oder ein fragment getContext()

AlertUtils.showOKDialog(MyActivity.this, "title of dialog", "message to display in dialog");

+0

Warum kann ich getapplicationContext() nicht verwenden, da dies generischer ist als MyActivity.this, das in jeder Java/Projektdatei geändert werden muss. – DriveCarefully

+0

Das ist eine akzeptablere Lösung, außer dass ich den Aktivitätsnamen komplett umgestalten muss. Der Code ist generisch genug. – DriveCarefully

+0

Es gibt eine gute Erklärung der verschiedenen Arten von Kontext und was sie bieten können, hier: [Context Compatibilities] (https://possiblemobile.com/2013/06/context/) Scrollen Sie nach unten zum Abschnitt Context Compatibilities in der Nähe der Hälfte Nieder. Grundsätzlich kann der 'applicationContext' keine Dialoge anzeigen. Der Aktivitätskontext ist der einzige Kontext, der einen Dialog anzeigen kann. – behelit

0
public class Utils { 
    public void showDialog(Context context) { 
     AlertDialog alertDialog = new AlertDialog.Builder(context).create(); 
     alertDialog.setTitle("Alert"); 
     alertDialog.setMessage("Alert message to be shown"); 
     alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
       } 
      }); 
     alertDialog.show(); 
    } 
} 

In Ihrem Activity, können Sie zeigen Dialog von

new Utils().showDialog(MyActivity.this);

+0

Es ist keine gute Idee, eine Klasse nur für ein Util zu initialisieren. Mach einfach deinen showDialog als 'statisch'. – Enzokie

+0

@Enzokie Können Sie erklären warum? oder können Sie mir einen nützlichen Link dazu geben –

+0

[So sollten Sie vermeiden, Objektinstanzen zu erstellen, die Sie nicht benötigen] (https://developer.android.com/training/articles/perf-tips.html), Second wenn Sie Ihren showDIalog als statisch machen können; Sie können einfach so tun 'Utils.showDialog (....)' und seinen Weg sauberer. – Enzokie

0

Sie wieder verwenden Ihre Warnung Dialog Code separat in einer Klasse wie unten schreiben: Sie

public class Utils{ 
    public static void showMessage(final Activity activity, String title, String posText){ 

    MaterialDialog dialog = new MaterialDialog.Builder(activity) 
      .content(title) 
      .positiveText(posText) 
      .onPositive(new MaterialDialog.SingleButtonCallback() { 
       @Override 
       public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { 

        dialog.dismiss(); 
       } 
      }) 
      .build(); 
    dialog.show(); 

} 
} 

Und von Ihrer Aktivität/Fragment kann dies als nennen:

Aktivität

AppUtils.showMessage(this, getString("your text"), getString("your text")); 

Fragment,

AppUtils.showMessage(getActivity(),getString("your text"), getString("your text")); 

Import Utils-Klasse in beiden Fragmenten oder Aktivität dann wird alles perfekt funktionieren.

Hoffe das hilft Ihnen, Ihr Problem loszuwerden.

+0

Können Sie den Code testen? die Übergabe von "dieser" aus der Aktivität wird einen Fehler haben – DriveCarefully

+0

@DriveCarefully ich benutze den gleichen Code in meiner App .. es funktioniert gut.Wenn es Ihnen ein Problem gibt, können Sie versuchen 'youractivity.this' anstelle von diesem. – Riten

+0

Da die Codes andere Elemente wie MaterialDialog enthalten, kann ich keine Tests durchführen. Aber es scheint, wir können Aktivitätsaktivität statt Kontextkontext übergeben. Gibt es einen Unterschied? – DriveCarefully

Verwandte Themen