繁体   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