2017-11-10 4 views
0

Ich habe gerade angefangen zu lernen Android-Programmierung und bekam Problem: My alert dialog's don't show up.Android: AlertDialog zeigt nicht

Meine Idee: Wenn App gestartet wurde, überprüft es automatisch, ob das Gerät mit dem Internet verbunden ist, und gibt Vorschläge (nach Alarmdialogen).

Ich hoffe wirklich, dass einige eine Lösung haben, weil ich in vielen Tutorials suchen, aber überall war Code, der mit onClickListener (Button) beginnt

Code Snippet:

public class SplashActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    checkConnection(); 

    Intent intent = new Intent(this, MainActivity.class); 
    startActivity(intent); 
    finish(); 
} 


void checkConnection() { 
    final ConnectivityManager connMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); 
    final android.net.NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
    final android.net.NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

    AlertDialog.Builder connectionAlert = new AlertDialog.Builder(this); 

    if (wifi.isConnectedOrConnecting()) { 
     // Do nothing 
    } else if (mobile.isConnectedOrConnecting()) { 

     connectionAlert.setMessage("We recommend to use wifi, enable it?"); 
     connectionAlert.setPositiveButton("Enable", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface arg0, int arg1) { 
       Toast.makeText(SplashActivity.this,"Wifi has been enabled!",Toast.LENGTH_LONG).show(); 
      } 
     }); 

     connectionAlert.setNegativeButton("No",new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       finish(); 
      } 
     }); 

     connectionAlert.show(); 

    } else { 

     connectionAlert.setMessage("Please, enable internet connection!"); 
     connectionAlert.setNeutralButton("Wifi", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface arg0, int arg1) { 
       Toast.makeText(SplashActivity.this,"Wifi has been enabled!",Toast.LENGTH_LONG).show(); 
      } 
     }); 

     connectionAlert.setNeutralButton("Mobile Data", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface arg0, int arg1) { 
       Toast.makeText(SplashActivity.this,"Mobile Data has been enabled!",Toast.LENGTH_LONG).show(); 
      } 
     }); 

     connectionAlert.setNegativeButton("No",new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       finish(); 
      } 
     }); 

     connectionAlert.show(); 

    } 
} 

}

+0

Sind Sie sicher, dass Sie keine Verbindung zum WLAN herstellen? Das erste, was zu tun ist, das "if - else if - else" Stück zu kommentieren und zu überprüfen, ob der Alarm gut funktioniert, ohne dass seine Sichtbarkeit beeinträchtigt wird. Wenn es gut geht, fallen Sie wahrscheinlich in die erste wenn, wo keine Warnung angezeigt wird. BTW warum nennst du 'finish()'? Lassen Sie uns es entfernen und prüfen, ob die Warnung korrekt angezeigt wird, bevor Sie 'Aktivität' ändern. – MatPag

+1

1.Ja, ich bin nicht mit Wifi verbunden. 2.Es hat alles mit" Toast "gearbeitet. 3. Ich verwendete finish(), wegen des Tutorials. (Entfernt es, nichts ändert sich). 4.Ich habe gerade herausgefunden, ob ich diesen Code kopiere und in MainActivity einfüge (funktioniert) – Crelix

+0

Haben Sie versucht, 'setContentView (R.layout.your_layout)' aufzurufen, um ein Layout für die 'SplashActivity' vor dem Aufruf von' checkConnection() 'zu setzen? – MatPag

Antwort

1

Kontext hinzufügen.

public class SplashActivity extends AppCompatActivity { 

private Context context; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    context = this; 

    checkConnection(); 

    Intent intent = new Intent(this, MainActivity.class); 
    startActivity(intent); 
    finish(); 
} 

///////

Ändern Sie diese Zeile:

AlertDialog.Builder connectionAlert = new AlertDialog.Builder(this); 

An:

AlertDialog.Builder connectionAlert = new AlertDialog.Builder(context); 
+0

Stellen Sie sicher, dass Sie auch das Layout in Ihrem SplashActivity onCreate aufblasen, tun Sie es unter super.onCreate (savedInstanceState); und registrieren Sie die neue Aktivität in Ihrer Manifestdatei, falls sie nicht bereits vorhanden ist. – HaroldSer

0

Ich denke, das Problem, weil Sie Finish auf dem Splash-Aktivität aufrufen ! warum Sie es beenden müssen, obwohl Sie Warndialog über seinen Kontext anzeigen müssen!

Ihre logcat überprüfen Sie finden diese

YourActivity Fenster [email protected] geleckt hat, die ursprünglich hier

hinzugefügt wurde, kann man entfernen Aktivität beenden .. und die Aktivitätsaktion beenden, um eine der Aktionen der Dialogschaltflächen zu sein.

0

Das Problem ist, dass Sie ein AlertDialog mit dem SplashActivity Kontext erstellen, aber Sie sind Finishing Ihres SplashActivity direkt nach und der Kontext, in dem die AlertDialog existiert nicht mehr gehört.

In Anbetracht dessen, dass Sie zu Ihrer zweiten Aktivität wechseln möchten, MainActivity, nur bevor Sie Enable wählen, wenn Sie diese Nachricht anzeigen We recommend to use wifi, enable it?. Was Sie tun können, ist etwas in der Art:

public class SplashActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     checkConnection(); 
    } 


    void checkConnection() { 
     final ConnectivityManager connMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); 
     final android.net.NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
     final android.net.NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

     AlertDialog.Builder connectionAlert = new AlertDialog.Builder(this); 

     if (wifi.isConnectedOrConnecting()) { 
      // Do nothing 
     } else if (mobile.isConnectedOrConnecting()) { 

      connectionAlert.setMessage("We recommend to use wifi, enable it?"); 
      connectionAlert.setPositiveButton("Enable", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface arg0, int arg1) { 
        Toast.makeText(SplashActivity.this, "Wifi has been enabled!", Toast.LENGTH_LONG).show(); 
        Intent intent = new Intent(SplashActivity.this, MainActivity.class); 
        startActivity(intent); 
        finish(); 
       } 
      }); 

      connectionAlert.setNegativeButton("No", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        finish(); 
       } 
      }); 

      connectionAlert.show(); 

     } else { 

      connectionAlert.setMessage("Please, enable internet connection!"); 
      connectionAlert.setNeutralButton("Wifi", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface arg0, int arg1) { 
        Toast.makeText(SplashActivity.this, "Wifi has been enabled!", Toast.LENGTH_LONG).show(); 
       } 
      }); 

      connectionAlert.setNeutralButton("Mobile Data", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface arg0, int arg1) { 
        Toast.makeText(SplashActivity.this, "Mobile Data has been enabled!", Toast.LENGTH_LONG).show(); 
       } 
      }); 

      connectionAlert.setNegativeButton("No", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        finish(); 
       } 
      }); 

      connectionAlert.show(); 

     } 
    } 
} 

Es gibt viele Optionen hier. Aber das Wichtigste ist, dass Sie tatsächlich die AlertDialog zeigen, aber Sie sind nicht in der Lage, es zu sehen, weil Sie eine andere Aktivität starten und die SplashActivity beenden, den Kontext zu zerstören (this), wo die AlertDialog wurde zuerst instanziiert new AlertDialog.Builder(this);.