从其他类获取View.OnClickListener吗?

时间:2018-12-24 13:59:56

标签: java android onclicklistener

我在Android中是一个非常新的角色,我一直无法处理来自单独类的OnClickListeners

在我的主Main_Activity中,我有很多按钮和View.OnClickListeners来处理它们。 OnClickListeners的代码看起来很乱,所以我决定将它们移到将要保留它们的单独的类中。 之后,我遇到了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    }
};

获取侦听器的方法取决于将要打印的字符串

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);

问题是:
Listeners_Utils.class中的Main_Activity.class获取侦听器并将其应用于指定按钮的正确方法是什么?

感谢您考虑我的问题!

4 个答案:

答案 0 :(得分:0)

我建议您使用Android数据绑定,在其中您可以将逻辑与视图分开。这样,所有侦听器都将在与Activity或Fragment类不同的类中处理。以下是Google关于数据绑定的官方文档的链接 https://developer.android.com/topic/libraries/data-binding/expressions#event_handling

答案 1 :(得分:0)

通常,由活动自己处理视图较为简单,但是假设您要按照自己的方式行事,可以这样做:

// 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");

答案 2 :(得分:0)

我不明白您的目标是为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;
        }
    }
}

答案 3 :(得分:0)

其他解决方案也不错,但是如果您想保持相同的活动,也可以使用此方法 如果您不想创建

button1Listener = new View.OnClickListener() {
 @Override
 public void onClick(View view ) {
 /some code    
     }
 }; 

您可以在XML文件中使用按钮的onClick属性。

例如: 在XML文件

    <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() ; 
}