私が構築しているアプリケーションでこの問題が発生しています。設計上の欠点やベスト プラクティス アプローチの欠如はすべて無視してください。これは純粋に、私が解決できない例を示すためのものです。
を使用してカスタムセットDialogFragment
で基本を返すものがあります。これに特定のサイズ要件がある場合、 custom 内のすべてのコンテンツを表示するために を正しくサイズ変更するにはどうすればよいですか?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);
// 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
。カスタムView
( myView
) は、幅 800、高さ 300 である必要があり、オーバーライドで正しく設定されていますonMeasure()
。これView
は、デバッグの目的で測定された境界をマゼンタで描画します。
800 の幅はDialog
、デバイスのデフォルト サイズよりも広いですが、正しく伸ばされるのではなく、切り取られています。
私は次の解決策を見てきました:
- DialogFragment.getDialog が null を返す
- Androidでデフォルトのアラートダイアログの幅と高さを制御するには?
- アラート ダイアログまたはカスタム アラート ダイアログのサイズ
次の 2 つのコーディング方法を推測しました。
- の を取得し、次
WindowManager.LayoutParams
をDialog
使用してオーバーライドしますmyDialog.getDialog().getWindow().get/setAttributes()
setLayout(w, h)
メソッドの使用myDialog.getDialog().getWindow().setLayout()
私は考えられるあらゆる場所でそれらを試しました (オーバーライドonStart()
、onShowListener
、 が作成されて表示された後など)。通常、特定の値が指定されているDialog
場合、両方のメソッドを正しく機能させることができます。しかし、供給されても何も起こりません。LayoutParams
WRAP_CONTENT
助言がありますか?
編集:
状況のスクリーンショット:
特定の値のスクリーンショット (ここに 900 が入力されていることに注意してください。850 はビューの幅全体をカバーしていません。これは、ウィンドウ全体が調整されていることを考えると理にかなっています。したがって、別の値が必要な場合は、必要な理由WRAP_CONTENT
/修正された理由が提供されます)値は適切ではありません):