gpt4 book ai didi

android - 全屏宽度的 DialogPreference

转载 作者:行者123 更新时间:2023-11-29 01:03:17 25 4
gpt4 key购买 nike

我在我的 Android 应用程序中创建了一个自定义对话框首选项,但我无法弄清楚如何让显示的对话框跨越显示器的整个宽度。

image of dialog with too much space on left and right side

我发现了许多建议的解决方案,以在全屏模式下获得正常的对话框

但是通过 getWindow 设置属性不起作用:

@Override
public Dialog getDialog() {

Dialog dialog = super.getDialog();
dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
// or
// dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

return dialog;
}

并且将全屏主题应用于我的对话框根元素也没有完成这项工作:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
[...]
android:theme="@style/FullscreenTheme">

此外,我无法访问对话框的 onCreate 方法(至少我不知道如何),无法在那里设置样式。

有没有人遇到同样的问题并针对这个非常具体的问题找到了解决方案?

我的布局:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:orientation="vertical"
android:padding="0dp"
android:paddingTop="@dimen/preferences_dialog_def_padding"
android:paddingBottom="@dimen/preferences_dialog_def_padding">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginTop="-2dp"
android:background="@color/expandable_preference_divider"/>

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/preferences_expandable_margin_top_bottom"
android:layout_marginTop="@dimen/preferences_expandable_margin_top_bottom">

<RelativeLayout
android:id="@+id/icon_wrapper_choose"
android:layout_width="@dimen/preferences_expandable_icon_wrapper_size"
android:layout_height="@dimen/preferences_expandable_icon_wrapper_size"
android:layout_marginBottom="0dp"
android:layout_marginEnd="@dimen/preference_expandable_icon_margin"
android:layout_marginStart="@dimen/preference_expandable_icon_margin"
android:layout_marginTop="0dp"
android:gravity="center">

<ImageView
android:layout_width="@dimen/preferences_expandable_icon_size"
android:layout_height="@dimen/preferences_expandable_icon_size"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:cropToPadding="true"
android:scaleType="centerCrop"
android:src="@drawable/ic_settings_white_36dp"/>

</RelativeLayout>

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toEndOf="@+id/icon_wrapper_choose"
android:paddingBottom="@dimen/preferences_expandable_text_padding_top_bottom"
android:paddingTop="@dimen/preferences_expandable_text_padding_top_bottom"
android:text="@string/pref_wheel_circumference_choose"
android:textColor="@color/colorAccent"
android:textSize="@dimen/text_size_medium"
android:textStyle="bold"/>
</RelativeLayout>

<TextView
android:layout_width="match_parent"
android:layout_marginEnd="@dimen/preference_expandable_icon_margin"
android:layout_marginStart="@dimen/preference_expandable_icon_margin"
android:layout_height="wrap_content"
android:text="@string/etrto_hint"/>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="horizontal"
android:paddingBottom="20dp"
android:paddingEnd="?android:attr/scrollbarSize"
android:layout_marginStart="@dimen/preference_expandable_icon_margin"
android:weightSum="3"
>

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/etrto"/>

<Spinner
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"/>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingBottom="20dp"
android:paddingEnd="?android:attr/scrollbarSize"
android:layout_marginStart="@dimen/preference_expandable_icon_margin"
android:weightSum="3"
>

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/manufacturer"/>

<Spinner
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"/>

</LinearLayout>

</LinearLayout>

<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginTop="-2dp"
android:background="@color/expandable_preference_divider"/>

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/preference_category_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:orientation="vertical"
android:padding="5dp">

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/preferences_expandable_margin_top_bottom"
android:layout_marginTop="@dimen/preferences_expandable_margin_top_bottom">

<RelativeLayout
android:id="@+id/icon_wrapper_manual"
android:layout_width="@dimen/preferences_expandable_icon_wrapper_size"
android:layout_height="@dimen/preferences_expandable_icon_wrapper_size"
android:layout_marginBottom="0dp"
android:layout_marginEnd="@dimen/preference_expandable_icon_margin"
android:layout_marginStart="@dimen/preference_expandable_icon_margin"
android:layout_marginTop="0dp"
android:gravity="center">

<ImageView
android:id="@+android:id/icon"
android:layout_width="@dimen/preferences_expandable_icon_size"
android:layout_height="@dimen/preferences_expandable_icon_size"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:cropToPadding="true"
android:scaleType="centerCrop"
android:src="@drawable/ic_edit_white_36dp"/>

</RelativeLayout>

<TextView
android:id="@+android:id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toEndOf="@+id/icon_wrapper_manual"
android:paddingBottom="@dimen/preferences_expandable_text_padding_top_bottom"
android:paddingTop="@dimen/preferences_expandable_text_padding_top_bottom"
android:text="@string/pref_wheel_circumference_manually"
android:textColor="@color/colorAccent"
android:textSize="@dimen/text_size_medium"
android:textStyle="bold"/>
</RelativeLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="horizontal"
android:paddingBottom="20dp"
android:paddingEnd="?android:attr/scrollbarSize"
android:layout_marginStart="@dimen/preference_expandable_icon_margin"
android:weightSum="2.5"
>

<EditText
android:id="@+id/pref_dialog_wheelcircumference_et"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="wrap_content"
android:textAlignment="textEnd"
android:textColor="@color/colorFont"
android:textSize="@dimen/text_size_small"
android:inputType="number"/>

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:textAlignment="center"
android:text="@string/wheel_circumference_unit"/>

</LinearLayout>

</LinearLayout>
</LinearLayout>

我的自定义偏好类

public class WheelCircumferencePreference extends android.preference.DialogPreference {

private static String TAG = "CustomSwitchPreference";
private int mWheelCircumference;
public static int WHEEL_CIRCUMFERENCE_DEFAULT = 2125;

private int mDialogLayoutResId = R.layout.pref_dialog_wheelcircumference;

public WheelCircumferencePreference(Context context) {
this(context, null);
}

public WheelCircumferencePreference(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.dialogPreferenceStyle);
}

public WheelCircumferencePreference(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
setLayoutResource(R.layout.custom_preference);
setDialogLayoutResource(mDialogLayoutResId);
setPositiveButtonText(getContext().getString(R.string.dialog_save));
setNegativeButtonText(getContext().getString(R.string.dialog_cancel));
}

@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
// Default value from attribute. Fallback value is set to WHEEL_CIRCUMFERENCE_DEFAULT.
return a.getInteger(index, WHEEL_CIRCUMFERENCE_DEFAULT);
}

@Override
protected void onSetInitialValue(boolean restorePersistedValue,
Object defaultValue) {
would load value from shared preferences
if (restorePersistedValue) {
mWheelCircumference = getPersistedInt(WHEEL_CIRCUMFERENCE_DEFAULT);
} else {
mWheelCircumference = (Integer) defaultValue;
persistInt(mWheelCircumference);
}
}

private EditText mWheelCircumferenceEt;


@Override
protected void onBindDialogView(View view) {

mWheelCircumferenceEt = view.findViewById(R.id.pref_dialog_wheelcircumference_et);

if (mWheelCircumferenceEt == null) {
throw new IllegalStateException("preference dialog view must contain" +
" a EditText with id 'pref_dialog_wheelcircumference_et'");
}
mWheelCircumferenceEt.setText(Integer.toString(mWheelCircumference));


super.onBindDialogView(view);
}



@Override
public Dialog getDialog() {

//Dialog dialog = super.getDialog();

// WindowManager.LayoutParams p = getDialog().getWindow().getAttributes();
//p.height = LinearLayout.LayoutParams.WRAP_CONTENT;
//dialog.getWindow().setAttributes(p);

return dialog;
}

@Override
protected void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
String circumferenceText = mWheelCircumferenceEt.getText().toString();

try {
mWheelCircumference = Integer.parseInt(circumferenceText);
} catch (Exception e) {
NLog.e(TAG, "onDialogClosed - ", e);
mWheelCircumference = WheelCircumferencePreference.WHEEL_CIRCUMFERENCE_DEFAULT;
}
persistInt(mWheelCircumference);
}
}

编辑:

实际上我只希望对话框跨越屏幕的整个宽度,而不是高度。如果我要使用额外的 PreferenceFragment(因为 DialogPreference 已经嵌入到 PreferenceFragment 中),“对话框”(又名 Fragment)将占用完整的宽度和高度(我猜)。

我已经实现了一个没有 DialogPrefrence 的解决方案,它可以工作但并不十分优雅

  • 只使用普通的 EditTextPreference
  • 在我的 SettingsFragment 代码中为这个首选项添加一个 onPreferenceClickListener
    • ClickListener 显示一个简单的对话框

例子:

        Preference preference = findPreference(EXAMPLE_PREFRENCE);    

if (preference != null) {

preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
// showDialog();
}
});

但是由于我有很多首选项会显示对话框,所以用于创建和显示对话框的代码会加载 SettingsFragment 并使其几乎不可读。因此,我认为将显示对话框和处理首选项值的责任交给首选项和 XML 布局会是一个很好的解决方案。

不幸的是,我遇到了上面提到的“全宽问题”。

注意:修复了getDialog的代码,因为我测试了不同的版本(也结合了xml主题集)

最佳答案

最后我确实找到了这个问题的解决方案:

在showDialog方法中获取Preference的AlertDialog

@Override 
protected void showDialog(Bundle state) {
super.showDialog(state);
CustomDialogPreference.makeDialogFullScreen((AlertDialog) getDialog());
}

让它跨越整个宽度:

public static void makeDialogFullScreen(AlertDialog d) {
NLog.d(TAG, "makeDialogFullScreen enter ");
if (d != null) {
ViewGroup.LayoutParams params = d.getWindow().getAttributes();
if (params != null) {
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
d.getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);
}
}
}

关于android - 全屏宽度的 DialogPreference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49410646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com