自定义对话框不适用于 'setOnClickListener' Android studio
Custom dialog not working with 'setOnClickListener' Android studio
我遇到了一些奇怪的情况 - 我制作了一个自定义对话框,当单击 activity 中的按钮时该对话框会打开。自定义对话框包含一个关闭按钮,单击该按钮可关闭对话框,returns 用户可访问 activity。当我按原样 运行 代码(如下所示)时,它没有启动自定义对话框,而是转到主 activity (我认为要么重新打开应用程序,要么以某种方式为主创建一个假想的意图activity)。但是,当我 remove/comment 关闭按钮的代码 - 突出显示为 // === 此代码时,一切正常(自定义对话框打开)但关闭按钮不起作用。我不确定我错过了什么。
// Global variable
Button openDialog;
// ======
openDialog = (Button) findViewById(R.id.opendialog);
openDialog.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
final Dialog cusomDialog = new Dialog(sellActivity.this);
cusomDialog.setContentView(R.layout.customdialog);
// === This code
final Button close = (Button) findViewById(R.id.close);
close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cusomDialog.dismiss();
}
});
// === This code
cusomDialog.show();
}
});
有人能解释一下吗,我真的很困惑。
首先,您应该通过 cusomDialog
View Object 。
其次,对话框创建和调用方法错误。
final Button close = (Button)cusomDialog.findViewById(R.id.close);
close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cusomDialog.dismiss();
}
});
同样的问题
openDialog = (Button)cusomDialog.findViewById(R.id.opendialog); //Rectified
您应该阅读 Custom Dialog 了解更多信息。
在 Dialog
中初始化 Dialog
的视图:
替换为:
final Button close = (Button) findViewById(R.id.close);
有了这个:
final Button close = (Button) cusomDialog.findViewById(R.id.close);
我认为您应该扩充布局并获取视图并在自定义对话框中设置视图。
final Dialog cusomDialog = new Dialog(sellActivity.this);
View view = LayoutInflater.fromContext(sellActivity.this).inflate(R.layout.customdialog,false);
cusomDialog.setContentView(view);
Button close = (Button) view.findViewById(R.id.close);
祝你好运!!
如果你使用DataBinding
在XML中写一个回调:
android:onClick="@{_ -> viewModel.onClickAction()}"
如果您使用 ViewBinding
,请确保调用 onCreateView
和 onViewCreated
。参见 Android DialogFragment onViewCreated not called。
private lateinit var binding: YourDialogBinding
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
binding = YourDialogBinding.inflate(layoutInflater)
// Create usual or custom dialog
val builder = AlertDialog.Builder(requireContext()).setView(binding.root)
return builder.create()
}
// Need to return the view here or onViewCreated won't be called by DialogFragment
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
super.onCreateView(inflater, container, savedInstanceState)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
with(binding) {
...
我遇到了一些奇怪的情况 - 我制作了一个自定义对话框,当单击 activity 中的按钮时该对话框会打开。自定义对话框包含一个关闭按钮,单击该按钮可关闭对话框,returns 用户可访问 activity。当我按原样 运行 代码(如下所示)时,它没有启动自定义对话框,而是转到主 activity (我认为要么重新打开应用程序,要么以某种方式为主创建一个假想的意图activity)。但是,当我 remove/comment 关闭按钮的代码 - 突出显示为 // === 此代码时,一切正常(自定义对话框打开)但关闭按钮不起作用。我不确定我错过了什么。
// Global variable
Button openDialog;
// ======
openDialog = (Button) findViewById(R.id.opendialog);
openDialog.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
final Dialog cusomDialog = new Dialog(sellActivity.this);
cusomDialog.setContentView(R.layout.customdialog);
// === This code
final Button close = (Button) findViewById(R.id.close);
close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cusomDialog.dismiss();
}
});
// === This code
cusomDialog.show();
}
});
有人能解释一下吗,我真的很困惑。
首先,您应该通过 cusomDialog
View Object 。
其次,对话框创建和调用方法错误。
final Button close = (Button)cusomDialog.findViewById(R.id.close);
close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cusomDialog.dismiss();
}
});
同样的问题
openDialog = (Button)cusomDialog.findViewById(R.id.opendialog); //Rectified
您应该阅读 Custom Dialog 了解更多信息。
在 Dialog
中初始化 Dialog
的视图:
替换为:
final Button close = (Button) findViewById(R.id.close);
有了这个:
final Button close = (Button) cusomDialog.findViewById(R.id.close);
我认为您应该扩充布局并获取视图并在自定义对话框中设置视图。
final Dialog cusomDialog = new Dialog(sellActivity.this);
View view = LayoutInflater.fromContext(sellActivity.this).inflate(R.layout.customdialog,false);
cusomDialog.setContentView(view);
Button close = (Button) view.findViewById(R.id.close);
祝你好运!!
如果你使用
DataBinding
在XML中写一个回调:android:onClick="@{_ -> viewModel.onClickAction()}"
如果您使用
ViewBinding
,请确保调用onCreateView
和onViewCreated
。参见 Android DialogFragment onViewCreated not called。private lateinit var binding: YourDialogBinding override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { binding = YourDialogBinding.inflate(layoutInflater) // Create usual or custom dialog val builder = AlertDialog.Builder(requireContext()).setView(binding.root) return builder.create() } // Need to return the view here or onViewCreated won't be called by DialogFragment override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { super.onCreateView(inflater, container, savedInstanceState) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) with(binding) { ...