我目前有以下代码来构建一个带有ProgressBar
的等待对话框:
LayoutInflater factory = LayoutInflater.from(TherapistActivity.this);
View view = factory.inflate(R.layout.waitdialog, null);
dialog = new AlertDialog.Builder(TherapistActivity.this)
.setView(view)
.setCancelable(false)
.create();
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
WindowManager.LayoutParams wmlp = dialog.getWindow().getAttributes();
wmlp.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
wmlp.x = 0; //x position
wmlp.y = Math.round(metrics.density * 100); //y position
wmlp.width = Math.round(metrics.density * 55); //doesn't appear to work
以下是我的对话框的XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/top"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="55dp"
android:layout_height="55dp"
android:background="@drawable/boxbkg">
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"/>
</RelativeLayout>
我希望我的对话框是一个只有旋转ProgressBar
的小方块对话框。但是,即使使用wmlp.width = Math.round(metrics.density * 55)
,对话框仍然很宽。
解决这个问题的正确方法是什么?
答案 0 :(得分:0)
据我所知,更改对话框 - 参数/宽度和高度 - 应该在onCreate(需要设置样式)和onCreateDialog(设置参数)中进行。
来自自定义DialogFragment的这两种方法的示例,它们在整个屏幕上发生,没有任何边距:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, R.style.AppTheme);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
Window w = dialog.getWindow();
w.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
params.verticalMargin = 0;
params.horizontalMargin = 0;
params.x=0;
params.y = 0;
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
params.width= ViewGroup.LayoutParams.MATCH_PARENT;
params.height = ViewGroup.LayoutParams.MATCH_PARENT;
w.setGravity(Gravity.TOP| Gravity.LEFT);
return dialog;
}
如果有帮助,请告诉我。
答案 1 :(得分:0)
我明白了。看来我还需要两行代码。在设置宽度之前,我需要这行代码:
wmlp.copyFrom(dialog.getWindow().getAttributes());
设置宽度后,我需要这行代码:
dialog.getWindow().setAttributes(wmlp);
答案 2 :(得分:0)
不幸的是,原始代码与答案中的其他代码结合使用不适用于我的代码,这可能是由于使用v_intention7
引起的。
以下代码(已通过Java 8 / min API 24 / target API 27测试)可与Fragment
一起使用,并适用于纵向和横向屏幕方向。它使您可以将对话框的大小设置为任意大小(请参见下文),而无需设置其位置,因为最后它仍然只是带有自定义{{的常规Fragment
(无按钮或标题) 1}}:
AlertDialog
我的view
布局:
AlertDialog.Builder builder = new AlertDialog.Builder((AppCompatActivity) getActivity());
builder.setView(R.layout.progress_view);
AlertDialog loadingDialog = builder.create();
loadingDialog.show();
loadingDialog.getWindow().setLayout(400,400); //You have to call this after "show"!
//loadingDialog.dismiss();
我以前尝试使用progress_view
,但没有成功,对话框仍然使用其原始大小。这里重要的一点是<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/progress_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="#FF0000"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="20dp"
android:paddingEnd="20dp"
android:paddingStart="20dp"
android:paddingTop="20dp">
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
,因为只有这样才能使进度圈实际上位于LinearLayout
的中心。使用match_parent
将其推到对话框的左上方。
结果如下:
您当然可以添加更多内容,例如AlertDialog
,或将背景颜色设置为您想要的任何颜色,这只是我注意到的两件事:
wrap_content
的白色背景。我尝试按照建议的here(自定义样式或TextView
)更改对话框的透明度,但是,即使它起作用了,该对话框仍然失去圆角并被压扁了。