2017-12-25 14 views
0

Hallo, ich bin neu in Android und ich bin verwirrt mit diesem Schlüsselwort in Aktivitätskontexten. Hier ist ein Codeausschnitt, der einfach auf den Bildschirm gedruckt wird, wenn eine Taste gedrückt wird. Aber das Studio wirft ein Problem auf.Was ist der Name der Aktivität in der anonymen Klasse

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Log.d("My app","onCreate is called"); 
    Toast1("onCreate"); 
    Button btn=(Button)findViewById(R.id.button); 
    btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d("My app","Button is pressed"); 
      Toast.makeText(this,"Button pressed",Toast.LENGTH_SHORT).show();//Here is a error 
     } 
    }); 
} 

Woher weiß man, auf welche Aktivität oder Klasse dieses Keyword verweist?

+0

https: // st ackoverflow.com/questions/4128589/difference-between-activity-context-and-application-context lesen Sie diese –

Antwort

2

Innerhalb der anonymen Klasse bezieht sich this auf den Block der anonymen Klasse. Um auf die Aktivitätsklasse beziehen, die die anonyme Klasse enthält, müssen Sie den Klassennamen und . vor dem this Stichwort

ActivityClassName.this 

Toast erfordert entweder den Kontext der Aktivität anhängen, auf dem es angezeigt werden soll, oder das Kontext der Anwendung

Toast mit Aktivität Kontext

Toast.makeText(Activityname.this,"Button pressed",Toast.LENGTH_SHORT).show(); 

Nicht e: Wenn sich Ihre Toast in einer anonymen Klasse befindet, müssen Sie ActivityName.this verwenden. Wenn das nicht der Fall ist, würde einfach die Verwendung this die Arbeit machen.

Toast mit Anwendungskontext

Toast.makeText(getApplicationContext(),"Button pressed",Toast.LENGTH_SHORT).show(); 
+0

Ist nicht der Kontext die Klasse, die die Methode abdeckt?. So sollte der Kontext von Toast hier die anonyme Klasse sein –

+0

Siehe die bearbeitete Antwort – Yousaf

1

Wenn die Aktivität, die Sie "MyActivity" Called verwenden, dann können Sie wie folgt vorgehen:

MyActivity.this 

Dieser Teil des Codes wird die Rückkehr Dieses "aktuelle" Objekt der äußeren Klasse wird für Sie arbeiten.

 protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Log.d("My app","onCreate is called"); 
    Toast1("onCreate"); 
    Button btn=(Button)findViewById(R.id.button); 
    btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d("My app","Button is pressed"); 
      Toast.makeText(MyActivity.this 
    ,"Button pressed",Toast.LENGTH_SHORT).show();//here is the working code for you 
     } 
    }); 
} 
1

Für Toasts, die kurzlebig sind, können Sie normalerweise den Kontext verwenden, den Sie möchten. Normalerweise würden Sie den Aktivitätskontext verwenden, aber der Anwendungskontext ist ebenfalls gut.

So können Sie Classname.this verwenden ZB: - MainActivity.this oder getApplicationContext();

1

Grundsätzlich onClick(View v) Methode ist anonyme Klasse, die Methode der Schnittstelle implementiert android.view.View.onClickListner so nur this Schlüsselwort Kontext nicht zu anonymer Klasse gehört

so können Sie anhand von this Schlüsselwort mit verwandten Activity in Schaltfläche onClickListner wie unten Code definieren

btn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d("My app","Button is pressed"); 
     Toast.makeText(MainActivity.this,"Button pressed",Toast.LENGTH_SHORT).show(); //Change here 
    } 
}); 

für mehr Referenzprüfung this link

Verwandte Themen