如何解决使 Dialog 类识别来自 Android 中 MainActivity 类的变量值
我正在开发一款应用,当用户点击页面顶部的“笑话”按钮时,该应用会随机显示一个笑话。当用户单击此按钮时,将出现一个对话框,其中将显示笑话的标题、设置和用于显示另一个对话框的妙语按钮,该对话框将显示笑话的妙语。当我创建对话框时,我试图弄清楚如何将标题和消息设置为 MainActivity.java 文件中声明的数组的值。到目前为止,我能够找出在两个对话框之间来回切换并随时退出它们的代码。但是,我被困在如何从 MainActivity java 文件中检索对话框 java 文件中的数组值。我尝试向 MainActivity 文件中的 buttonShowDialog() 和 onOKClick 方法添加代码,但这不会使对话框文件识别数组值。我认为这是一个 OOP 问题,但我被卡住了。任何建议将不胜感激。
主Activity.java
package edu.psu.jjb24.csjokes;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.MenuInflater;
import android.view.MenuItem;
import java.util.Random;
public class MainActivity<currentJoke> extends AppCompatActivity implements DisplaySetupDialog.OKClickListener,DisplayPunchlineDialog.OKClickListener{
String[] joke_title;
String[] joke_setup;
String[] joke_punchline;
int currentJoke = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Set the action bar
Toolbar myToolbar = findViewById(R.id.toolbar);
setSupportActionBar(myToolbar);
joke_title = getResources().getStringArray(R.array.JokeTitle);
joke_setup = getResources().getStringArray(R.array.JokeSetup);
joke_punchline = getResources().getStringArray(R.array.JokePunchline);
}
public int getCurrentJoke(String[] array){
int random = new Random().nextInt(array.length);
currentJoke = random;
return currentJoke;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_main,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_joke:
buttonShowDialog();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void buttonShowDialog() {
DisplaySetupDialog setupDialog = new DisplaySetupDialog();
setupDialog.show(getSupportFragmentManager(),"setupDialog");
}
public void onOKClick() {
DisplayPunchlineDialog punchlineDialog = new DisplayPunchlineDialog();
punchlineDialog.show(getSupportFragmentManager(),"punchlineDialog");
}
public void onOKClick2() {
buttonShowDialog();
}
}
DisplaySetupDialog.java
package edu.psu.jjb24.csjokes;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Context;
import android.os.Bundle;
import androidx.fragment.app.DialogFragment;
public class DisplaySetupDialog extends DialogFragment{
public interface OKClickListener {
public void onOKClick();
}
private OKClickListener mListener;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState){
AlertDialog.Builder setup = new AlertDialog.Builder(getActivity());
setup.setTitle("joke_title").setMessage("joke_setup")
.setPositiveButton("Punchline",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id){
mListener.onOKClick();
}
})
.setNegativeButton("Cancel",int id) {
}
});
return setup.create();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
mListener = (OKClickListener) context;
}
catch (ClassCastException e) {
throw new ClassCastException(context.toString() + "must implement OKClickListener");
}
}
}
DiplayPunchlineDialog.java
import android.os.Bundle;
import androidx.fragment.app.DialogFragment;
public class DisplayPunchlineDialog extends DialogFragment {
public interface OKClickListener {
public void onOKClick2();
}
private DisplayPunchlineDialog.OKClickListener mListener2;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState){
AlertDialog.Builder setup = new AlertDialog.Builder(getActivity());
setup.setTitle("joke_title").setMessage("joke punchline")
.setPositiveButton("Setup",int id){
mListener2.onOKClick2();
}
})
.setNegativeButton("Done",int id) {
}
});
return setup.create();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
mListener2 = (DisplayPunchlineDialog.OKClickListener) context;
}
catch (ClassCastException e) {
throw new ClassCastException(context.toString() + "must implement OKClickListener");
}
}
}
解决方法
当您创建 Fragment 的新实例时,您应该将 Fragment 需要的信息(笑话)传递给它。为了让 Fragment 正确处理运行时配置更改,您应该在创建新的 Fragment 实例时使用我们在 Android 中使用的特殊模式:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。