有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有自定义视图的java AlertDialog:调整大小以包装视图的内容

我正在构建的一个应用程序中遇到了这个问题。请忽略所有的设计缺陷和缺乏最佳实践方法,这纯粹是为了展示一个我无法解决的例子

我有DialogFragment,它返回一个基本的AlertDialog,带有一个使用AlertDialog.Builder.setView()的自定义View集。如果这个View有一个特定的大小要求,我如何让Dialog正确地调整自身大小,以显示自定义View中的所有内容

以下是我一直在使用的示例代码:

package com.test.test;

import 安卓.os.Bundle;
import 安卓.app.Activity;
import 安卓.app.AlertDialog;
import 安卓.app.Dialog;
import 安卓.app.DialogFragment;
import 安卓.content.Context;
import 安卓.graphics.Canvas;
import 安卓.graphics.Color;
import 安卓.graphics.Paint;
import 安卓.graphics.Paint.Style;
import 安卓.view.Gravity;
import 安卓.view.LayoutInflater;
import 安卓.view.View;
import 安卓.view.WindowManager;
import 安卓.view.View.OnClickListener;
import 安卓.view.ViewGroup;
import 安卓.view.ViewGroup.LayoutParams;
import 安卓.widget.ArrayAdapter;
import 安卓.widget.Button;
import 安卓.widget.EditText;
import 安卓.widget.FrameLayout;
import 安卓.widget.LinearLayout;
import 安卓.widget.Spinner;
import 安卓.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Use a button for launching
        Button b = new Button(this);
        b.setText("Launch");
        b.setOnClickListener(new OnClickListener() {    
            @Override
            public void onClick(View v) {
                // Launch the dialog
                myDialog d = new myDialog();
                d.show(getFragmentManager(), null);
            }
        });

        setContentView(b);
    }

    public static class myDialog extends DialogFragment {

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {           
            // Create the dialog
            AlertDialog.Builder db = new AlertDialog.Builder(getActivity());
            db.setTitle("Test Alert Dialog:");
            db.setView(new myView(getActivity()));

            return db.create();
        }

        protected class myView extends View {
            Paint p = null;

            public myView(Context ct) {
                super(ct);

                // Setup paint for the drawing
                p = new Paint();
                p.setColor(Color.MAGENTA);
                p.setStyle(Style.STROKE);
                p.setStrokeWidth(10);
            }

            @Override
            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                setMeasuredDimension(800, 300);
            }

            @Override
            protected void onDraw(Canvas canvas) {
                // Draw a rectangle showing the bounds of the view
                canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), p);
            }
        }
    }
}

一个Button被创建,点击打开DialogFragment。自定义ViewmyView)要求宽度为800,高度为300,在onMeasure()的覆盖中正确设置。此View以洋红色绘制其测量边界,以进行调试

800的宽度比我的设备上默认的Dialog宽,但被剪裁而不是正确拉伸

我已经研究了以下解决方案:

我推断出以下两种编码方法:

  1. 获取DialogWindowManager.LayoutParams并使用myDialog.getDialog().getWindow().get/setAttributes()覆盖它们
  2. 通过myDialog.getDialog().getWindow().setLayout()使用setLayout(w, h)方法

我在我能想到的任何地方都尝试过它们(覆盖onStart(),在onShowListener,在Dialog被创建和显示之后,等等),如果LayoutParams被提供了一个特定值,通常可以让这两种方法正常工作。但只要提供了WRAP_CONTENT,什么都不会发生

有什么建议吗

编辑:

情况截图: enter image description here

特定值的屏幕截图(注900在这里输入,850没有覆盖视图的整个宽度,考虑到整个窗口正在调整,这是有意义的。因此,如果需要另一个窗口,这提供了WRAP_CONTENT是必要的原因/固定值不合适): enter image description here


共 (0) 个答案