2016-03-22 8 views
2

zu drücken Ich habe einen Client, der versucht, eine Verbindung zu einem Server herzustellen. Nach 5 Sekunden gibt es eine Zeitüberschreitung, wenn die Verbindung fehlgeschlagen ist. Ich wundere mich, ein Popup-Fenster ohne Verbindungszeichen und "Versuchen Sie es erneut zu verbinden" -Taste zu öffnen. Das Popup wird im Thread erstellt. Wenn die Verbindung fehlgeschlagen ist, wird der Thread beendet. Aus diesem Grund habe ich die Click-Methode in meine Hauptaktivität eingefügt. Warum funktioniert es nicht?Versuchen, Button von PopupWindow in Thread

Code, der Thread läuft nach der Verbindung fehlschlägt:

((Activity) context).runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       LayoutInflater inflater = (LayoutInflater) 
         ((Activity) context).getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       final PopupWindow noConnection = new PopupWindow(
         inflater.inflate(R.layout.popup_no_connection, null, false), 
         800, 
         800, 
         true); 
       noConnection.setAnimationStyle(R.style.AnimationFade); 
       noConnection.showAtLocation(((Activity) context).findViewById(R.id.entrance_layout), Gravity.CENTER, 0, 0); 
       globalClass.getErrorHandler().setNoConnectionWithServer(noConnection); 
      } 
     }); 

-Code in Haupttätigkeit:

((GlobalClass) getApplicationContext()).initiateClass(); 
    globalClass = ((GlobalClass)getApplicationContext()); 

    LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View popupWindowView = inflater.inflate(R.layout.popup_no_connection, null, false); 
    Button refreshConnection = (Button) popupWindowView.findViewById(R.id.btn_reconnect); 
    refreshConnection.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      if (globalClass.getErrorHandler().getNoConnectionWithServer() != null) { 
       Communication communication = new Communication(globalClass, entrance.this); 
       globalClass.setCommunication(communication); 
       Thread t = new Thread(communication); 
       t.start(); 
       globalClass.getErrorHandler().getNoConnectionWithServer().dismiss(); 
      } 
     } 
    }); 

Antwort

0

Natürlich wird der onClick Rückruf nicht aufgerufen. Warum? Weil:

// you find button in a view 
View popupWindowView = inflater.inflate(R.layout.popup_no_connection, null, false); // this return new view 
Button refreshConnection = (Button) popupWindowView.findViewById(R.id.btn_reconnect); 

// but you create pop up with another view not from above (which contain listener) 
final PopupWindow noConnection = new PopupWindow(
        inflater.inflate(R.layout.popup_no_connection, null, false), 
        800, 
        800, 
        true); 

So, wie man es löst? Es gibt 2 Möglichkeiten:
1. Speichern Sie Ihre Popup-Ansicht nach inflate und verwenden Sie sie erneut, wenn Sie in Ihrem runnable eine Popup-Ansicht erstellen.
2. finden Sie Ihre Button und setOnclickListener innerhalb des Runnable nach dem Erstellen pop-up view

+0

Dank der Mensch du mir sehr geholfen :) – Netanel

0

Ich denke, Ihre Animation nicht auf die Schaltfläche klicken wird ermöglicht. Versuchen Sie dies ohne Animation. Ich habe ein ähnliches Problem, meine Taste, die von links nach rechts animiert ist, kann während und nach der Animation nicht klicken. Und es funktioniert ohne Animation.