Error due to invalid combination of Toast and OnClickListener
Question
I'm trying to use Toast
inside OnCLickListener
. My code triggers the following error:
The method makeText(Context, CharSequence, int) in the type Toast is not applicable for the arguments (new View.OnClickListener(){}, String, int)
This is my code:
Button register = (Button) findViewById(R.id.register);
register.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
EditText name = (EditText)findViewById(R.id.name);
String Lname = name.getText().toString();
Toast.makeText(this, Lname, Toast.LENGTH_SHORT).show();
}
});
Solution
As The Kenny said, this
is refering to the View.OnClickListener
instead of your Activity
. Change this, to MyActivity.this
.
For example,
public class MyActivity extends Activity {
// ... other code here
Toast.makeText(MyActivity.this, Lname, Toast.LENGTH_SHORT).show();
OTHER TIPS
In this case, this
refers to the instance of the anonymous subclass of View.OnClickListener
. You have to refer to the this
of the class where you create the anonymous class.
Use MyActivity.this
as this
refers to your onclickListener
.
You can use getApplicationContext()
as well. See the documentation.
Anywhere, just use the following:
((Activity) mContext).runOnUiThread(new Runnable() {
public void run() {
Toast my_toast = Toast.makeText(mContext, "YOUR TEXT OR STRING", Toast.LENGTH_LONG);
my_toast.setGravity(Gravity.CENTER, 0, 0);
my_toast.show();
}
});
You just need to define at the top of your activity (just after the onCreate):
mContext = this;
Also, see that I decomposed it a bit to be able to handle the gravity as I want (sometimes you may want the toast to appear at the center of the screen)...
Another approach to achieve your goal is to implement the OnClickListener
interface. This way you implement the onClick()
method in your Activity
and you could thus assign this
. In addition, you can assign this
to multiple Button
s. You can distinguish these Button
s from each other by comparing their IDs via an appropriate if
, respectively switch
statement within the onClick()
method.
public class MyActivity extends Activity implements OnClickListener{
// ...
protected void onCreate (Bundle savedInstanceState){
// ...
Button register = (Button) findViewById(R.id.register);
register.setOnClickListener(this);
}
public void onClick(View arg0) {
EditText name = (EditText) findViewById(R.id.name);
String text = name.getText().toString();
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
}
}
try this
public void onClick(View arg0) {
EditText name = (EditText)findViewById(R.id.name);
String Lname = name.getText().toString();
Toast.makeText(arg0.getContext(), Lname, Toast.LENGTH_SHORT).show();
}