我在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
获取侦听器并将其应用于指定按钮的正确方法是什么?
感谢您考虑我的问题!
答案 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() ;
}