如何(以及何时)将Android中的AlertDialog移动到屏幕上的新位置?

时间:2014-10-03 14:16:25

标签: android alertdialog

我需要将Android的AlertDialog移动到屏幕上不会遮挡某些活动小部件的位置。我实际上有两个问题:

  1. 在调用dlg.show()之前,我可以使用LayoutParams和wnd.setAttributes()设置对话窗口位置,其中LEFT | TOP重力。但是,我需要测量对话框大小以计算对话框位置。 我可以在显示之前测量AlertDialog大小吗?我所知道的所有测量对话框大小的方法都需要在窗口内检索视图但只是调用wnd.getDecorView()会导致后续的dlg.show ()抛出异常“在设置内容之前必须调用请求窗口功能”。因此,我无法在调用show()之前测量AlertDialog大小,是吗?

  2. 一旦对话框布局,我就能得到它的大小。例如,我可以使用wnd.setCallback(),然后在onContentChanged()中我可以在装饰视图中添加一个OnGlobalLayoutListener,以便获取关于GlobalLayout()的通知。在该通知中,我可以使用两种方法移动对话框:
    A.使用LayoutParams和wnd.setAttributes()
    B.或使用LayoutParams和mWindowManager.updateViewLayout(wnd.getDecorView(),lp);
    对话框已移动,但是......然后将其移回原始位置。我可以在显示屏上看到它移动到新位置然后移回原始位置。 WTF?!?!?

    我试图postDelayed()移动对话框,如果延迟是> 300毫秒它似乎工作。但是它适用于所有Android设备吗?我猜不是......所以问题是何时将AlertDialog移动到新位置是适当的?

  3. 有人知道更好的方法来计算警报对话框大小并将其移动到屏幕上的新位置吗?

    谢谢!

1 个答案:

答案 0 :(得分:0)

package com.example.alertDialogMove;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.WindowManager;

public class MainActivity extends Activity {
    int x;
    int y;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        x=0;
        y=0;
        adb();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    private void adb(){
        AlertDialog.Builder ad = new AlertDialog.Builder(this);
        ad.setTitle("Um, I am an alert dialog made by rico");
        ad.setMessage("To change my position hit the button move me");
        ad.setPositiveButton("Click to move me",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int id) {
                int Min=0;
                int Max=200;
                x=Min + (int)(Math.random() * ((Max - Min) + 1));
                y=Min + (int)(Math.random() * ((Max - Min) + 1));
                dialog.cancel();
                adb();
            }


          });
        ad.setNegativeButton("Close",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int id) {
                dialog.cancel();
            }
        });

        AlertDialog aD = ad.create();
        WindowManager.LayoutParams wmlp = aD.getWindow().getAttributes();

         wmlp.gravity = Gravity.TOP | Gravity.LEFT;
         wmlp.x = x;
         wmlp.y = y;
         aD.show();
    }
}

你可以像上面那样容易地转移,通过在新的位置解雇和重建它,我不知道如何获得它的高度;(