こんにちは、ダイアログを表示するためにDialogFragment
を使用しているAndroidアプリケーションで作業していますが、その幅は非常に小さいです。この幅をfill_parent
にするにはどうすればよいですか?
public class AddNoteDialogFragment extends DialogFragment {
public AddNoteDialogFragment() {
// Empty constructor required for DialogFragment
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
getDialog().setTitle(getString(R.string.app_name));
View view = inflater.inflate(R.layout.fragment_add_note_dialog,
container);
return view;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
// request a window without the title
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
return dialog;
}
}
fragment_add_note_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@Android:color/white"
Android:orientation="vertical"
Android:paddingBottom="@dimen/activity_vertical_margin"
Android:paddingLeft="@dimen/activity_horizontal_margin"
Android:paddingRight="@dimen/activity_horizontal_margin"
Android:paddingTop="@dimen/activity_vertical_margin" >
<EditText
Android:id="@+id/addNoteEditText"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:gravity="top"
Android:hint="@string/clock_enter_add_note"
Android:imeOptions="actionDone"
Android:inputType="textCapSentences|textMultiLine"
Android:lines="5" />
<Button
Android:id="@+id/submit"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="10dp"
Android:background="@drawable/login_button"
Android:text="@string/submit_button"
Android:textColor="@Android:color/white" />
</LinearLayout>
前もって感謝します。
これは私がこの問題を処理するために見つけた解決策です:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
return dialog;
}
@Override
public void onStart() {
super.onStart();
Dialog dialog = getDialog();
if (dialog != null) {
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
}
編集:
拡大表示を返す前に、フラグメントのonCrateView
メソッドで以下のコードを使用できます。
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Android.graphics.Color.TRANSPARENT));
画面サイズの90%を警告ダイアログで埋める方法 のElvisの回答を使用してみましたか?
次のとおりです。
dialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
更新:
上記のコードは、DialogFragment
のonStart()
メソッド内に追加する必要があります。
LayoutParams.FILL_PARENT
は非推奨です。代わりにLayoutParams.MATCH_PARENT
を使用してください。
これは私のために働いています
カスタムスタイルを作成します。
<style name="DialogStyle" parent="Base.Theme.AppCompat.Dialog">
<item name="Android:windowMinWidthMajor">97%</item>
<item name="Android:windowMinWidthMinor">97%</item>
</style>
ダイアログでこのスタイルを使用します
public class MessageDialog extends DialogFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogStyle);
}
// your code
}
私にとっては、onCreateViewでRelativeLayoutによって膨らまされたレイアウトの親のLinearLayoutを置き換えたときに機能しました。他のコード変更は必要ありません。
<!-- A blank view to force the layout to be full-width -->
<View
Android:layout_width="wrap_content"
Android:layout_height="1dp"
Android:layout_gravity="fill_horizontal" />
私のダイアログレイアウトの上部にあるトリックを行いました。
public class FullWidthDialogFragment extends AppCompatDialogFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, R.style.Theme_AppCompat_Light_Dialog_Alert);
}
}
さらに柔軟性が必要な場合は、AppCompat_Dialog_Alertとカスタム属性を拡張できます。
私の場合、次のアプローチも使用しました。
@Override
public void onStart() {
super.onStart();
getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, (int) getResources().getDimension(R.dimen.dialog_height));
}
}
ただし、ダイアログの左端と右端と一部のLollipop +デバイス(Nexus 9など)の画面の端との間にまだ小さなギャップがありました。
明らかではありませんでしたが、最終的にはすべてのデバイスとプラットフォームで全幅にすることがわかりましたウィンドウの背景は内部で指定する必要があります以下のようなstyles.xml:
<style name="Dialog.NoTitle" parent="Theme.AppCompat.Dialog">
<item name="Android:windowNoTitle">true</item>
<item name="Android:padding">0dp</item>
<item name="Android:windowBackground">@color/window_bg</item>
</style>
そしてもちろん、このスタイルは、次のようなダイアログを作成するときに使用する必要があります。
public static DialogFragment createNoTitleDlg() {
DialogFragment frag = new Some_Dialog_Frag();
frag.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog_NoTitle);
return frag;
}
これをはっきりさせたい。どちらの方法も正しい、ただし、異なるDialogFragmentを使用。
Android.app.DialogFragment
を使用@Override
public void onStart()
{
super.onStart();
Dialog dialog = getDialog();
if (dialog != null)
{
int width = ViewGroup.LayoutParams.MATCH_PARENT;
int height = ViewGroup.LayoutParams.MATCH_PARENT;
dialog.getWindow().setLayout(width, height);
}
}
Android.support.v4.app.DialogFragment
を使用@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, Android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}
副作用なしで私のために働く別のソリューションは次のとおりでした:
DialogFragmentを拡張するクラスで:
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogStyle);
}
あなたのスタイルで:
<style name="DialogStyle" parent="ThemeOverlay.AppCompat.Dialog.Alert"></style>
他のソリューションに基づいて、独自のソリューションを作成しました。
<style name="AppTheme.Dialog.Custom" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="Android:windowNoTitle">true</item>
<item name="Android:windowMinWidthMajor">100%</item>
<item name="Android:windowMinWidthMinor">100%</item>
</style>
abstract class BaseDialogFragment : DialogFragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(DialogFragment.STYLE_NO_TITLE, R.style.AppTheme_Dialog_Custom)
}
}
Style.xmlファイルにカスタムスタイルを作成します。このコードをコピーして、style.xmlファイルに貼り付けてください
<style name="CustomDialog" parent="@Android:style/Theme.Holo.Light" >
<item name="Android:windowBackground">@null</item>
<item name="Android:windowIsFloating">true</item>
</style>
次に、DialogFragmentのcreateDialogメソッドで、コードによってダイアログオブジェクトを作成します
dialog = new Dialog(getActivity(), R.style.CustomDialog);
これは私のために働いており、これがあなたにも役立つことを願っています
dialogFragmentのonCreateViewメソッドでこれを使用します
Display display = getActivity().getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, **220**, getResources().getDisplayMetrics());
getDialog().getWindow().setLayout(width,px);
22はダイアログフラグメントの高さです。必要に応じて変更してください
レイアウトルートで、Android:minWidthを非常に大きな値に設定します。
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:minWidth="9999999dp">
...
</LinearLayout>
DialogFragment内のユーザーAlertDialog.Builder。このようにonCreateDialog
メソッドに追加します。そしてonCreateView
では何もしません。
public Dialog onCreateDialog(Bundle savedInstanceState)
{
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
View view = LayoutInflater.from(getContext()).inflate(R.layout.gf_confirm_order_timeout_dialog, null);
final Bundle args = getArguments();
String message = args.getString(GfConstant.EXTRA_DATA);
TextView txtMessage = (TextView) view.findViewById(R.id.txt_message);
txtMessage.setText(message);
view.findViewById(R.id.btn_confirm).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (mListener != null)
{
mListener.onDialogConfirmOK();
}
}
});
builder.setView(view);
Dialog dialog = builder.create();
dialog.setCanceledOnTouchOutside(false);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
return dialog;
}
これは、この問題に直面したときに解決した方法です。これを試して。
dialogFragment onActivityCreatedで、必要に応じてこのコードを追加します。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
myview=inflater.inflate(R.layout.fragment_insurance_detail, container, false);
intitviews();
return myview;
}
@Override
public void onActivityCreated(Bundle arg0) {
super.onActivityCreated(arg0);
getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
getDialog().getWindow().setGravity(Gravity.CENTER);
}