2017-02-03 2 views
0

Verzeichnisstruktur meiner Tätigkeit wie funktioniert nicht unterButton-Click-Handler wird in Android Studio

enter image description here

Deshalb ist die Taste ID bekommen, ich Code unten

View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false); 

btnLogin = (Button)rootView.findViewById(R.id.btnLogin); 
schrieb

Aber, Aus irgendeinem Grund, wenn ich auf den Knopf klicke, kommt es nicht in den Handbereich. Fehle ich etwas? Mein Code ist unten.

btnLogin.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
    } 
}); 

komplette Code der Aktivität

Paket com.example.pankajgarg.android.Activities.UserManagement.Auth.Login;

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

import com.example.pankajgarg.android.R; 

public class LoginActivity extends AppCompatActivity { 

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


     View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false); 

     btnLogin = (Button)rootView.findViewById(R.id.btnLogin); 
     btnLogin.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     setContentView(R.layout.activity_login); 
    } 
} 
+0

Denken Sie daran, dass alle Java-Code in einer Methode in einer Klasse sein muss. Bitte bearbeiten Sie Ihre Frage, um dies zu zeigen. –

+0

Fügen Sie einen Toast hinzu/Loggen Sie sich in onClick ein und sehen Sie, ob es aufgerufen wird! –

+1

Sie scheinen auch eine Login ** -Aktivität ** zu haben, warum also blähen Sie ein Layout auf? Das ist für Fragmente gemacht. –

Antwort

1

Der beste Weg, man darüber gehen kann, ist durch setContentView(R.layout.activity_login) in Ihrer onCreate()-Methode und dann auf die Schaltfläche mit findViewById(R.id.btnLogin) ziehen.

protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    //insert this line here 
    setContentView(R.layout.activity_login); 

    //Pull the button with the id 
    btnLogin = (Button) findViewById(R.id.btnLogin); 

    //set onclicklistener 
    btnLogin.setOnClickListener(new View.OnClickListener(){ 
    public void onClick(View view){ 
    Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show(); 
    } 
}); 
} 
1
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false); 

    btnLogin = (Button)rootView.findViewById(R.id.btnLogin); 
    btnLogin.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    setContentView(R.layout.activity_login); 
} 

Die Linie setContentView(R.layout.activity_login); bläht das Layout und zeigt die Ansichten in Ihrer XML definiert. Dies sind völlig andere Instanzen als die, die durch den vorherigen Aufruf an inflate() erstellt wurden. Sie scheinen die Art und Weise zu mischen, wie wir eine Ansicht für ein Fragment aufblähen und wie wir es für eine Aktivität tun. In Aktivitäten rufen wir einfach setContentView() an. Dies bedeutet, dass Sie Ihren Code auf die folgenden ändern sollte:

die richtige Taste finden die OnClickListener, um den Code
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 

    btnLogin = (Button)findViewById(R.id.btnLogin); 
    btnLogin.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

Jetzt.

Beachten Sie, dass die ersten beiden Zeilen von onCreate() immer so aussehen wie hier gezeigt. Der einzige Unterschied ist der Name des Layouts, das in setContentView() verwendet wird. Sie werden viele Kopfschmerzen vermeiden, wenn Sie immer diesem Muster folgen.

+0

Ich habe bereits Code im Handler. aber ich habe den Code nicht geteilt. Ich konnte sicherstellen, dass der Handler nicht aufgerufen wurde, weil ich den Breakpoint benutzte. –

+1

@PankajGarg, um die Hilfe zu erhalten, die Sie benötigen, sollten Sie den tatsächlichen Code zeigen, der zu Ihrer Frage gehört. In diesem Fall ist die genaue Logik innerhalb des Hörers nicht relevant, aber es hat uns angehalten zu wissen, dass etwas da ist. Ein Kommentar, der uns sagt, dass Sie den Code absichtlich weggelassen haben, ist sehr passend. –

+0

@PankajGarg Ich habe meine Antwort bearbeitet. Es ist sehr ähnlich zu anderen, die mich bis zum Schlag geschlagen haben. Der Hauptunterschied besteht darin, dass ich eine Erklärung hinzugefügt habe, was Sie falsch machen, sowie die Lösung, um es zu beheben. –

0

Unter der Annahme, dass Sie getan haben, was @-Code-Lehrling sagt (etwas setzen auszuführen), gibt es andere Dinge, die passieren können:

  • Ist der Knopf clickable? Prüfen Sie es im Layout oder setzen Sie sie mit

    btnLogin.setClickable(true);

  • ist der Knopf enabled? Das Gleiche wie vorher.

  • Gibt es eine andere View Überlappung der Schaltfläche, die den Klick vor es fängt?

2

Vor allem in einer Aktivität Sie nicht brauchen, um das Layout aufblasen verknüpfen Sie es mit der setContentView Methode:

setContentView(R.layout.activity_login); 

Zweitens, wenn Sie es die anonymen tun wollen So sind Sie bereit, zu gehen, aber etwas zu der onClick Methode hinzufügen:

btnLogin = (Button)findViewById(R.id.btnLogin); 
btnLogin.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     // do whatever like... 
     Log.d("MyActivity", "Click!"); 
     Toast.makeText(this, "Click!", Toast.LENGTH_SHORT); 
    } 
}); 

Oder Sie können es auf diese Weise tun:

btnLogin = (Button)findViewById(R.id.btnLogin); 
btnLogin.setOnClickListener(this); 

Wenn Sie es auf diese Weise tun müssen Sie die View.OnClickListener in Ihrer Aktivität implementieren mit:

public class LoginActivity extends Activity implements View.OnClickListener { 
    // Your Activity code 
} 

Und schließlich wieder, wenn Sie etwas tun, nicht in Ihrem Klick-Methode Android wird es nicht tun, so:

@Override 
public void onClick(View view) { 
    // do whatever like... 
    Log.d("MyActivity", "Click!"); 
    Toast.makeText(this, "Click!", Toast.LENGTH_SHORT); 
} 
+0

Wenn Sie 'setOnClickListener (this)' aufrufen, müssen Sie 'setOnClickListener (new View.OnClickListener())' nicht aufrufen, da Sie die 'onClick()' Methode in Ihrer Aktivität bereits überschreiben. Es sei denn, ich lese deine Antwort falsch. – Pztar

+0

Ja, Sie haben recht, es gibt zwei Wege, einen in meiner Antwort und den anonymen Weg, wie in der OP-Frage –

+1

Sie sollten den Wortlaut Ihrer Antwort ändern, weil es so aussieht, als würden Sie beide vorschlagen! – Pztar

2

entfernen View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false); und ersetzen sie durch setContentView

public class LoginActivity extends AppCompatActivity { 

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

     btnLogin = (Button) findViewById(R.id.btnLogin); 
     btnLogin.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 
Verwandte Themen