AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Title");
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();
Run Code Online (Sandbox Code Playgroud)
我使用上面的代码来显示警报对话框.默认情况下,它以宽度填充屏幕,高度填充wrap_content.
如何控制默认警报对话框的宽度和高度?
我试过了:
alert.getWindow().setLayout(100,100); // It didn't work.
Run Code Online (Sandbox Code Playgroud)
如何在警报窗口中获取布局参数并手动设置宽度和高度?
我在我正在构建的应用程序中遇到此问题.请忽略所有设计缺点和缺乏最佳实践方法,这纯粹是为了展示我无法解决的一个例子.
我有DialogFragment一个AlertDialog使用自定义View设置返回基本AlertDialog.Builder.setView().如果这View有特定的大小要求,我如何Dialog正确调整自身大小以显示自定义中的所有内容View?
这是我一直使用的示例代码:
package com.test.test;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); …Run Code Online (Sandbox Code Playgroud) java android android-layout android-alertdialog android-dialogfragment
我想启动一个带有自定义布局的对话框,我已经通过DialogFragment实现了该对话框.(我基本上只是改变了onCreateView()并添加了按钮处理程序).该对话框允许用户快速更改重要设置.
该对话框将从几个不同的活动中启动.不同的活动没有太多共同之处,只是在用户更改设置后需要刷新.他们不需要从对话中获取任何信息; 他们只需要知道何时关闭(被解雇).
我尝试在onResume()中刷新活动,但启动和解除对话框似乎永远不会调用此方法.(所以我不确定它为什么会存在,但这可能是另一个问题的主题.)
接下来,我尝试在对话框中添加DialogInterface.OnDismissListener:
public static void showMyDialog(OnDismissListener listener, Activity activity)
{
DialogFragment fragment = new MyDialogFragment();
fragment.show(activity.getFragmentManager(), "date");
activity.getFragmentManager().executePendingTransactions();//A
fragment.getDialog().setOnDismissListener(listener);//B
}
Run Code Online (Sandbox Code Playgroud)
当我最初省略A行时,我在B行得到了NullPointerException,因为此时对话框为null.根据这个SO答案的建议,我调用了executePendingTransaction().这会在B行导致IllegalStateException,并且消息"OnDismissListener已被DialogFragment占用,无法替换." 我也尝试在调用show()之前放入setOnDismissListener(),但这总是导致NullPointerException.
然后我读了另一个SO答案,其中说原始提问者"在DialogFragment的生命周期中过早地调用getDialog()." 所以我尝试在DialogFragment中添加一个构造函数:
public MyDialogFragment(SomeCallback illTakeAnythingICanGet)
{
//I'll store the callback here and call it later
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,添加一个构造函数让Android Lint发出致命的警告,当我查了一下时,我在这个问题中发现了一条评论,似乎说这种方法会让对话无法处理用户在对话框中旋转屏幕开了.
如果用户旋转屏幕,当DialogFragment关闭(被解雇)的方式不会破坏我的应用程序时,活动如何计算?我应该在DialogFragment之外使用其他东西吗?
我试图从扩展ListFragment的Fragment的onActivityCreated方法设置DialogFragment的标题.
public void onActivityCreated(Bundle savedState) {
super.onActivityCreated(savedState);
ListView lv = this.getListView();
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int pos, long id) {
android.app.FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
RatingDialogFragment newFragment = new RatingDialogFragment();
newFragment.getDialog().setTitle("String");
fragmentTransaction.add(newFragment, "dialog");
newFragment.show(fragmentTransaction, "dialog");
return true;
}
});
}
Run Code Online (Sandbox Code Playgroud)
这会产生空指针异常,因为DialogFragment的mDialog仍然为null.
请参阅:DialogFragment.getDialog返回null
有想法该怎么解决这个吗?
android android-fragments android-dialogfragment android-listfragment