簡體   English   中英

從其他類獲取View.OnClickListener嗎?

[英]Get View.OnClickListener from other class?

我在Android中是一個非常新的人,我一直在處理來自單獨類的OnClickListeners

在我的Main Main_Activity我有很多按鈕和View.OnClickListeners來處理它們。 OnClickListeners代碼看起來很亂,所以我決定將它們移到將要保留它們的單獨的類中。 然后Main_ActivityMain_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM