[英]Get View.OnClickListener from other class?
我在Android中是一個非常新的人,我一直在處理來自單獨類的OnClickListeners
在我的Main Main_Activity
我有很多按鈕和View.OnClickListeners
來處理它們。 OnClickListeners
代碼看起來很亂,所以我決定將它們移到將要保留它們的單獨的類中。 然后Main_Activity
我Main_Activity
不想將它們應用於分離類的問題。
我試圖在ListenersHolder
類中創建方法,該方法設置了指定的偵聽器,但這無法正常工作,因為無法從靜態上下文中引用非靜態方法:
//code for separate class that helds listeners
public abstract class Listeners_Utils extends Main_Activity implements View.OnClickListener {
private final View.OnClickListener listener;
private final Main_Activity main;
public Listeners_Utils (Main_Activity main, View.OnClickListener listener) {
this.listener = listener;
this.main = main;
}
//listners itself
View.OnClickListener button1Listener = new View.OnClickListener() {
@Override
public void onClick(View view ) {
/some code }
};
View.OnClickListener button2Listener = new View.OnClickListener() {
@Override
public void onClick(View view ) {
/some code }
};
....
View.OnClickListener buttonNListener = new View.OnClickListener() {
@Override
public void onClick(View view ) {
/some code }
};
獲取偵聽器的方法取決於將要打印的String
public View.OnClickListener getListener(String listenerName) {
switch (listenerName) {
case "button1":
massButton.setOnClickListener(massListener);
break;
case "button2":
lengthButton.setOnClickListener(lengthListener);
break;
return listener;
在我的活動中,我有類似的內容,但是它不起作用
Button1.setOnClickListener(Listeners_Utils.getListener(button1);
Button2.setOnClickListener(Listeners_Utils.getListener(button2);
....
ButtonN.setOnClickListener(Listeners_Utils.getListener(buttonN);
所以問題是:
什么是從Main_Activity.class
Listeners_Utils.class
獲取偵聽Listeners_Utils.class
並將其應用於指定按鈕的正確方法?
感謝您考慮我的問題!
我建議您使用Android數據綁定,在其中您可以將邏輯與視圖分開。 這樣,所有偵聽器都將在與Activity或Fragment類不同的類中處理。 以下是Google關於數據綁定的官方文檔的鏈接https://developer.android.com/topic/libraries/data-binding/expressions#event_handling
通常,活動自己處理視圖比較簡單,但是假設您要按照自己的方式行事,可以這樣進行:
// Should not extend MainActivity
public class ListenersUtils {
public static View.OnClickListener getListener(final MainActivity main, String listenerName) {
switch (listenerName) {
case "button1":
return new View.OnClickListener() {
@Override
public void onClick(View view ) {
//some code that can reference MainActivity
}
};
default:
break;
}
return null;
}
}
在您的MainActivity中:
button1.setOnClickListener(ListenersUtils.getListener("button1");
我不明白您的目標是為onClicklistener創建抽象類。 但是要回答如何在活動中獲取特定按鈕,您可以這樣做。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn1;
private Button btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = findViewById(R.id.my_button);
btn2 = findViewById(R.id.my_button2);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.my_button:
Toast.makeText(this, "Ok", Toast.LENGTH_SHORT).show();
break;
case R.id.my_button2:
Toast.makeText(this, "Ok2", Toast.LENGTH_SHORT).show();
break;
}
}
}
其他解決方案也不錯,但是如果您想保持相同的活動,也可以使用此方法,如果您不想創建
button1Listener = new View.OnClickListener() {
@Override
public void onClick(View view ) {
/some code
}
};
您可以在XML文件中使用按鈕的onClick屬性。
例如:IN XML FILE
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button"
android:text="Click me "
android:onClick="createToast"
/>
在MainActivity中:定義單擊按鈕時要執行的功能
public void createToast(View view) {
Toast.makeText(MainActivity.this , "Clicked on the button " , Toast.LENGTH_SHORT).show() ;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.