相同的按钮(带动作)在多个布局



我正在制作一个android应用程序,我想在应用程序的每个布局上都放一个设置按钮。当我按下设置按钮时,会弹出一个自定义对话框,我可以访问应用程序设置。我遇到的问题是,我想在某些类中引用1个方法(对我来说哪一个都无关紧要)。我已经在我的布局XML中使用了include,像这样:

<include android:id="@+id/settingsButton"
layout="@layout/settingsbuttonlayout"/>

settingsbuttonlayout.xml文件看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/root_vg">
<ImageButton
android:layout_width="50dp"
android:layout_height="50dp" app:srcCompat="@drawable/settingsicon" 
android:id="@+id/settings_dialog"
android:cropToPadding="true"
android:adjustViewBounds="false" android:scaleType="fitCenter"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintHorizontal_bias="0.133"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintVertical_bias="0.123"
android:clickable="true"
android:focusable="true"
android:background="@drawable/customdialog" android:onClick= "showSettings"
app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

您可以看到在这个布局中定义了一个onclick。然而(据我所知)这意味着我需要相同的"showsettings"。方法在每个布局类中。我怎么能解决这个问题,所以我应该只写"showSettings"方法一次又可以参考一下吗?这是showSettings方法:

public void showSettings(View v){
Dialog dialog = new Dialog(this, R.style.DialogStyle);
dialog.setContentView(R.layout.settings_dialog);
dialog.getWindow().setBackgroundDrawableResource(R.drawable.dialogbackground);
Button btnClose = dialog.findViewById(R.id.close_settings);
btnClose.setOnClickListener(view -> dialog.dismiss());
dialog.show();}
PS:我是一个制作应用程序和GUI的新手。我还没有在学校里学过,我只是自己弄清楚一切,所以如果这是一些直接或愚蠢的问题,我很抱歉:)

您可以从调用showSettings的settings_dialog中删除onClick属性,接下来创建一个Utility.java文件,您可以在其中将函数设置为静态

public static void showSettings(View v){
Dialog dialog = new Dialog(this, R.style.DialogStyle);
dialog.setContentView(R.layout.settings_dialog);
dialog.getWindow().setBackgroundDrawableResource(R.drawable.dialogbackground);
Button btnClose = dialog.findViewById(R.id.close_settings);
btnClose.setOnClickListener(view -> dialog.dismiss());
dialog.show();}

现在,在你想调用这个方法的任何类中,只要写入

Button settingsButton = (Button) findViewById(R.id.settingsButton);
settingsButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Utility.showSettings(v);
}
});

在搜索了更多之后,我发现了以下内容:无论我想从哪个类打开对话框,我都必须这样写:

SettingsDialog.showSettings(this);

在我的SettingsDialog类中,我有以下内容:

public class SettingsDialog {
static void showSettings(Context context) {
Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.settings_dialog);

Dialog.getWindow().setBackgroundDrawableResource(R.drawable.dialogbackground);
}
dialog.show();}
}

最新更新