【发布时间】:2014-07-14 09:50:15
【问题描述】:
在我的活动中,我有一个 AlertDialog,当按下按钮时会显示。我注意到,当屏幕旋转时,应用程序崩溃了。为了解决这个问题,我在onCreateDialog()方法中添加了这行代码:setRetainInstance(true);。
之后,活动不再崩溃,但 AlertDialog 消失了。
我在另一个活动上做了同样的事情,当某个条件为真时默认显示一个对话框,并且它在屏幕旋转时成功显示,因此我担心我的问题在于单击按钮时会调用对话框。
我还没有尝试过任何类似的清单解决方法:
<activity
android:name="YourActivityName"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
android:windowSoftInputMode="adjustPan">
</activity>
因为文档没有建议。
有什么方法可以让对话框保持打开而无需重新按下按钮?
这是我的活动:
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.NumberPicker;
import android.widget.TextView;
public class PiattoActivity extends Activity {
MenuQuantityDialogFragment dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.piatto_layout);
TextView tv_nome = (TextView) findViewById(R.id.piatto_name);
TextView tv_ingredients = (TextView) findViewById(R.id.piatto_ingredients);
TextView tv_description = (TextView) findViewById(R.id.piatto_description);
TextView tv_price = (TextView) findViewById(R.id.piatto_price);
Button b_add = (Button) findViewById(R.id.piatto_add);
Button b_quantity = (Button) findViewById(R.id.piatto_quantity);
String i = "Ingrediente;";
String d = "Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura ché la diritta via era smarrita.";
tv_nome.setText("Nome piatto");
tv_ingredients.setText(i + i + i + i + i + i);
tv_description.setText(d);
tv_price.setText("10€");
b_add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
dialog = new MenuQuantityDialogFragment();
FragmentManager fm = getFragmentManager();
dialog.show(fm, "frag_name");
}
});
}
public class MenuQuantityDialogFragment extends DialogFragment {
//crea il dialogfragment
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
setRetainInstance(true);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
NumberPicker np = new NumberPicker(PiattoActivity.this);
np.setMinValue(1);
np.setMaxValue(10);
np.setWrapSelectorWheel(false);
np.setValue(2);
builder.setView(np);
builder.setMessage(R.string.piatto_dialog_message)
.setTitle(R.string.piatto_dialog_title)
.setPositiveButton(R.string.piatto_dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dismiss();
}
})
.setNegativeButton(R.string.piatto_dialog_annulla, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dismiss();
}
});
return builder.create();
}
}
}
【问题讨论】:
-
为什么不在屏幕旋转之前在bundle上传递一个布尔变量,然后在从bundle中的数据旋转后再次显示对话框
-
@Der Golem,不完全是,我正在使用 DialogFragment。
标签: android android-alertdialog