我有一个TextViewer Activity,它有一个按钮,当我点击它时,我想弹出一个带有列表的AlertDialog.我按照这个链接但它不起作用(没有弹出窗口).我认为背景是错误的.我使用了以下代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.resources);
ImageButton btnlist = (ImageButton)findViewById(R.id.list);
btnlist.setOnClickListener(new View.OnClickListener() {
public void onClick (View v){
if (Vars.bookchapter>1){
final CharSequence[] items = {"Red", "Green", "Blue"};
Context mContext = getBaseContext();
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle("Pick a color");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
}
});
AlertDialog alert = builder.create();
}else{
//Nothing
}
}});
}
}
Run Code Online (Sandbox Code Playgroud) 伙计们我一整天都在搜索和研究这个问题.该应用程序不仅在对话框打开时崩溃,而且在旋转器打开时崩溃(我确信这将是一堆我没有遇到过的其他情况).
在onRetainNonConfigurationInstance()和onConfigurationChanged(配置newConfig)之间进行选择对我没有帮助.(也许我错了) - 实际上我更喜欢使用第一个.
但我想问:对于一个打开的对话框或打开的微调器,我是否必须从头开始创建所有内容?这是一种方式吗?有时,用户可能会改变方向,重新初始化一个包含大量小部件的大班级是没有价值的.
请给我提示和指导.提前致谢.
编辑:::
Error code:
01-25 17:56:48.182: ERROR/WindowManager(312): Activity XXX has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43e63058 that was originally added here
01-25 17:56:48.182: ERROR/WindowManager(312): android.view.WindowLeaked: Activity XXX has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43e63058 that
was originally added here
01-25 17:56:48.182: ERROR/WindowManager(312): at android.view.ViewRoot.<init>(ViewRoot.java:247)
01-25 17:56:48.182: ERROR/WindowManager(312): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
01-25 17:56:48.182: ERROR/WindowManager(312): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
01-25 17:56:48.182: ERROR/WindowManager(312): at android.view.Window$LocalWindowManager.addView(Window.java:424)
01-25 17:56:48.182: ERROR/WindowManager(312): at android.app.Dialog.show(Dialog.java:241)
01-25 17:56:48.182: ERROR/WindowManager(312): at XXX.menuGroupDialog(XXX.java:946)
0 1-25 17:56:48.182: ERROR/WindowManager(312): at XXX.onOptionsItemSelected
(GroupManagement.java:257)
01-25 17:56:48.182: ERROR/WindowManager(312): at android.app.Activity.onMenuItemSelected(Activity.java:2195)01-25 …Run Code Online (Sandbox Code Playgroud) 我试图在活动中使用警报对话框和异步任务,并收到以下错误
引起:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
码:
public class loginTask extends AsyncTask<Void, Void, Void> {
public ProgressDialog loginDialog = new ProgressDialog(
LoginActivity.this);
@Override
protected void onPreExecute() {
loginDialog.setMessage("Please wait Logging in");
loginDialog.show();
}
@Override
protected Void doInBackground(Void... params) {
if(loginUser()) {
loginDialog.dismiss();
alertbox("title", "winnn", "Okay");
} else {
loginDialog.dismiss();
alertbox("title", "message", "Okay");
}
return null;
}
@Override
protected void onPostExecute(Void unused) {
loginDialog.dismiss();
Intent intentHome = new Intent(LoginActivity.this,
HomeActivity.class);
startActivity(intentHome);
}
}
Run Code Online (Sandbox Code Playgroud) 这是我写的代码:
// create a view in dialog box
final View fileView = getLayoutInflater().inflate(R.layout.filename, null);
String[] array_spinner = new String[5];
array_spinner[0]="1";
array_spinner[1]="2";
array_spinner[2]="3";
array_spinner[3]="4";
array_spinner[4]="5";
Spinner s = (Spinner) findViewById(R.id.sp_CAT);
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item, array_spinner);
s.setAdapter(adapter);
s.setSelection(2);
//Spinner mCAT = (Spinner) findViewById(R.id.sp_CAT);
//ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
//fileView.getContext(), R.array.a_CAT, android.R.layout.simple_spinner_item);
//adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//mCAT.setAdapter(adapter);
EditText mSID = (EditText) fileView.findViewById(R.id.et_SID);
EditText mSCD = (EditText) fileView.findViewById(R.id.et_SCD);
EditText mNUM = (EditText) fileView.findViewById(R.id.et_NUM);
final String tSID=mSID.getText().toString();
final String tSCD=mSCD.getText().toString();
final String tNUM=mNUM.getText().toString();
// show dialog box …Run Code Online (Sandbox Code Playgroud) 我正在收到关于这个特殊异常的报告,它让我很难过,没有任何运气来寻找它.这个应用程序已经在少数几个不同的设备上进行了测试,没有任何类似的东西.
奇怪的是,用户第一次运行应用程序时,AlertDialog.Builder会创建并显示一个,因此AlertDialog.Building很可能是设备上的真实方法.文档还告诉我它自API级别1以来也存在.
例外是否可以指其他一些问题?
例外情况发生在运行2.3.6的GT-N7000 Galaxy Note上.
对堆栈跟踪进行反混淆处理:
java.lang.NoSuchMethodError: android.app.AlertDialog$Builder.
at com.slowchop.wifiheat.lib.heat.Filter.void showSubjectDialog(java.lang.String,java.lang.String)(SourceFile:143)
at com.slowchop.wifiheat.lib.heat.Filter.void showChangeAccessPoint()(SourceFile:128)
at com.slowchop.wifiheat.lib.heat.HeatActivity.boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem)(SourceFile:475)
at android.support.v4.app._ActionBarSherlockTrojanHorse.boolean onMenuItemSelected(int,com.actionbarsherlock.view.MenuItem)(SourceFile:119)
Run Code Online (Sandbox Code Playgroud)
方法包括:
private void showSubjectDialog(String title, final String filter) {
new AlertDialog.Builder(context, AlertDialog.THEME_HOLO_DARK)
.setTitle(title)
.setAdapter(subjectAdapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int i) {
ListItem item = (ListItem)subjectAdapter.getItem(i);
updateFilterFromAlertDialog(dialog, filter, item.id);
}
}).show();
}
Run Code Online (Sandbox Code Playgroud)
第143行是:
new AlertDialog.Builder(context, AlertDialog.THEME_HOLO_DARK)
Run Code Online (Sandbox Code Playgroud)
还有另一个堆栈跟踪来自不同的路径,但继续以showChangeAccessPoint()相同的方式调用.在这种情况下,AlertDialog.Builder从另一个调用错误AlertDialog.Builder!:
java.lang.NoSuchMethodError: android.app.AlertDialog$Builder.
at com.slowchop.wifiheat.lib.heat.Filter.void showSubjectDialog(java.lang.String,java.lang.String)(SourceFile:143)
at com.slowchop.wifiheat.lib.heat.Filter.void showChangeAccessPoint()(SourceFile:128)
at com.slowchop.wifiheat.lib.heat.Filter$2.void …Run Code Online (Sandbox Code Playgroud) 我有一个警告对话框,其中以编程方式添加了正面和负面按钮.在对话框布局中,还有两个按钮,位于AlertDialog的本机按钮上方.

当这两者紧挨着时,我意识到在这个对话框中,原生正/负/中性按钮的权重不同.它们的文本内容决定了它们的水平权重,而不是每个占用对话框的50%(如果有3个按钮则为33%).所以在我的情况下,负片按钮的文本比正面按钮的文本长,我们得到的东西看起来像我上面发布的图像.
我找不到办法解决这个问题,有没有人有想法?
谢谢!
要求的XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView android:id="@+id/rcd_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_margin="8dp"
android:text="@string/rating_dialog_text"
android:textSize="14dp"
android:textColor="@android:color/white"
android:gravity="center"/>
<RatingBar android:id="@+id/rcd_rating_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/rcd_msg"
android:layout_margin="8dp"
android:paddingBottom="10dp"
android:numStars="5"
android:rating="0"
android:layout_centerHorizontal="true"/>
<RelativeLayout android:layout_height="56dp"
android:layout_width="match_parent"
android:layout_below="@id/rcd_rating_bar">
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<RelativeLayout android:id="@+id/rcd_image"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:background="@color/selectable_transparent"
android:layout_weight="1">
<TextView android:id="@+id/rcd_image_text"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_centerInParent="true"
android:paddingLeft="0dp"
android:gravity="center"
android:text="@string/add_image"
android:textColor="@android:color/white"
android:textSize="16sp"
android:clickable="true"/>
<ImageView android:id="@+id/rcd_image_img"
android:layout_height="32dp"
android:layout_width="32dp"
android:layout_centerVertical="true"
android:layout_margin="8dp"
android:layout_toLeftOf="@id/rcd_image_text"
android:scaleType="centerInside"
android:src="@android:drawable/ic_menu_camera"/>
</RelativeLayout>
<RelativeLayout android:id="@+id/rcd_comment"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:background="@color/selectable_transparent"
android:layout_weight="1">
<TextView android:id="@+id/rcd_comment_text"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_centerInParent="true"
android:paddingRight="6dp" …Run Code Online (Sandbox Code Playgroud) 我正在尝试为AlertDialog按钮自定义重音颜色.但它似乎没有任何影响它似乎继承了系统的颜色.这是我的风格/主题.
<color name="actionable_items">#0574ac</color> <!-- it is blue color -->
<style name="LLDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
<!--buttons color-->
<item name="colorAccent">@color/actionable_items</item>
<!--item RadioButton or CheckBox color-->
<item name="colorControlActivated">@color/actionable_items</item>
<item name="colorPrimary">@color/actionable_items</item>
<item name="colorPrimaryDark">@color/actionable_items</item>
<item name="android:listChoiceIndicatorMultiple">@color/actionable_items</item>
<item name="android:listChoiceIndicatorSingle">@color/actionable_items</item>
</style>
Run Code Online (Sandbox Code Playgroud)
这是我的代码,它正在尝试构建Alertdialog.
final CustomPopupBuilder removePlaceDialog = new CustomPopupBuilder(new ContextThemeWrapper(context,
R.style.LLDialog));
removePlaceDialog.setTitle(getString(R.string.delete_place, placeName));
removePlaceDialog.setMessage(getString(R.string.delete_place_message));
removePlaceDialog.setPositiveButton(R.string.ok_button, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
....
....
}
});
removePlaceDialog.setNegativeButton(R.string.cancel, null);
removePlaceDialog.create().show();
Run Code Online (Sandbox Code Playgroud)
最终的AlertDialog没有具有相同文本颜色的按钮.文字颜色与绿色相似.它似乎是从系统继承颜色而不是自定义主题.这是图像:
编辑1:
我试过使用AlertDialog.Builder它,但它给了我相同的结果.
final AlertDialog.Builder removePlaceDialog = AlertDialog.Builder(new ContextThemeWrapper(context,
R.style.LLDialog));
removePlaceDialog.setTitle(getString(R.string.delete_place, placeName));
removePlaceDialog.setMessage(getString(R.string.delete_place_message));
removePlaceDialog.setPositiveButton(R.string.ok_button, new …Run Code Online (Sandbox Code Playgroud) 我坚持margin和padding一个标题的问题AlertDialog.Builder,我正在做的是我想要标题,center所以我使用setCustomTitle我能够这样做,但坚持边缘和填充它.我不希望显示不需要的填充,我也想设置一些标题的顶部边距,我正在使用,LinearLayout.LayoutParams但它没有任何影响.请建议如何处理它.谢谢
代码:
dialog = new AlertDialog.Builder(context, R.style.DialogTheme);
TextView title = new TextView(context);
title.setTextColor(ContextCompat.getColor(context, R.color.black));
title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
title.setTypeface(Typeface.DEFAULT_BOLD);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(0, 20, 0, 0);
title.setLayoutParams(lp);
title.setText("Dialog");
title.setGravity(Gravity.CENTER);
dialog.setCustomTitle(title);
dialog.setMessage("Dialog box with custom title view ");
dialog.setCancelable(false);
dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
Run Code Online (Sandbox Code Playgroud)
我在我的应用程序上使用警报对话框,但当用户触摸它时它会一直隐藏.这是我的代码:
public class DialogMessageEnd extends DialogFragment
{
String winner;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the Builder class for convenient dialog construction
Snooker_Scoreboard ss = new Snooker_Scoreboard();
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setCancelable(false);
builder.setMessage(ss.winnerPlayer + " won the match ("+ss.frame1ToPass+"-"+ss.frame2ToPass+")!")
.setPositiveButton("New Match!", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent i = new Intent(getContext(),PlayerSelection.class);
startActivity(i);
}
});
// Create the AlertDialog object and return it
return builder.create();
}
}
Run Code Online (Sandbox Code Playgroud)
如你所见,我用过
builder.setCancelable(false);
Run Code Online (Sandbox Code Playgroud)
但它仍然无法解决问题.你能帮助我吗?谢谢
我希望显示一个CardVeiw显示用户的一些信息.同时,我需要它的行为类似于一个对话框,同时,我需要让用户点击左下方的按钮,如下图所示,并翻转CardView显示另一个CardView更丰富的内容,如一些详细的描述......这是一个例子:
到目前为止,我知道我可以创建一个Dialog,但我的内容可以滚动.因此,Dialog在这种情况下使用a可能不是一个好习惯(根据https://material.io/guidelines/components/dialogs.html#dialogs-alerts).
所以我想知道这个问题的最佳实践是什么?