【问题标题】:Custom preference broken in Honeycomb/ICSHoneycomb/ICS 中的自定义首选项被破坏
【发布时间】:2012-01-06 19:00:09
【问题描述】:

我正在使用自定义首选项,其中包含标题、摘要和图标。首选项用于选择项目(皮肤、应用程序等),然后它将总结当前选择。这是正常工作的偏好(顶部)和我在 Honeycomb/ICS 上的问题:

http://imgur.com/vKPOu

http://imgur.com/EiMBr

正在为首选项留出空间,但即使是默认标题/摘要也没有显示,并且项目选择的意图也没有触发。这是首选项布局:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+android:id/widget_frame"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:gravity="center_vertical"
    android:paddingRight="?android:attr/scrollbarSize">
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16dip"
        android:layout_marginRight="6dip"
        android:layout_marginTop="6dip"
        android:layout_marginBottom="6dip"
        android:layout_weight="1">
        <TextView
            android:id="@+android:id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:ellipsize="marquee"
            android:fadingEdge="horizontal" />
        <TextView
            android:id="@+android:id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@android:id/title"
            android:layout_alignLeft="@android:id/title"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:maxLines="2" />
   </RelativeLayout>
   <ImageView
       android:id="@+id/icon"
       android:layout_width="48dp"
       android:layout_height="48dp"
       android:layout_gravity="center" />
</LinearLayout> 

还有自定义偏好本身:

import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.Drawable;
import android.preference.Preference;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;

public class SelectedAppPreference extends Preference {
    private Drawable mIcon;

    public SelectedAppPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        final PackageManager pm = context.getPackageManager();
        String packageName = context.getSharedPreferences("appPrefs", Context.MODE_PRIVATE).getString("selected_app_package", null);

        this.setLayoutResource(R.layout.icon_pref);
        try {
            this.mIcon = pm.getApplicationIcon(packageName);
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
    }

    public SelectedAppPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        final PackageManager pm = context.getPackageManager();
        String packageName = context.getSharedPreferences("appPrefs", Context.MODE_PRIVATE).getString("selected_app_package", null);

        this.setLayoutResource(R.layout.icon_pref);
        try {
            this.mIcon = pm.getApplicationIcon(packageName);
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onBindView(final View view) {
        super.onBindView(view);

        final ImageView imageView = (ImageView)view.findViewById(R.id.icon);
        if ((imageView != null) && (this.mIcon != null)) {
            imageView.setImageDrawable(this.mIcon);
        }
    }

    public void setIcon(final Drawable icon) {
        if (((icon == null) && (this.mIcon != null)) || ((icon != null) && (!icon.equals(this.mIcon)))) {
            this.mIcon = icon;
            this.notifyChanged();
        }
    }

    public Drawable getIcon() {
        return this.mIcon;
    }
}

偏好本身没有什么太令人兴奋的地方。我感觉问题出在首选项布局 xml 中,但我不确定究竟是什么工作不正常。我可以确认该首选项在 Android 2.1、2.2 和 2.3 设备上运行良好,并且我在 3.2 和 4.0 上遇到了问题。有什么建议吗?

【问题讨论】:

    标签: android android-layout android-3.0-honeycomb android-preferences android-4.0-ice-cream-sandwich


    【解决方案1】:

    我在第三方自定义首选项方面遇到了类似问题,并通过使小部件框架可见来修复它。它在 ICS 中默认是不可见的。不知道它如何映射到您的自定义偏好。

    // This line was in the original code.
    LinearLayout widgetFrameView = ((LinearLayout) mView
                        .findViewById(android.R.id.widget_frame));
    ...
    // This line fixed the visibility issue
    widgetFrameView.setVisibility(View.VISIBLE);
    

    还必须重新调整视图以使其与 ICS 控件的其余部分保持一致。

    【讨论】:

    • 漂亮,这就是问题所在。您是否还记得您为重新对齐视图所做的更改?
    • Google,你为什么要做出这样的重大改变?
    【解决方案2】:

    我修复的第三方自定义偏好取自此站点

    https://github.com/attenzione/android-ColorPickerPreference/tree/master/src/net/margaritov/preference/colorpicker

    我的代码(在 ColorPickerPreference.setPreviewColor() 中)看起来像

    widgetFrameView.setVisibility(View.VISIBLE);
    final boolean preApi14 = android.os.Build.VERSION.SDK_INT < 14;
    final int rightPaddingDip = preApi14 ? 8 : 5;
    
    widgetFrameView.setPadding(
                          widgetFrameView.getPaddingLeft(),
                          widgetFrameView.getPaddingTop(),
                          (int)(mDensity * rightPaddingDip),
                          widgetFrameView.getPaddingBottom()
                    );
    

    在哪里

    float mDensity = getContext().getResources().getDisplayMetrics().density;
    

    这是 minSdkVersion = 8 且没有 targetSdkVersion。如果您将 targetSdkVersion 设置为 14 或更高,您可能需要将“5”更改为其他值,直到右侧的自定义首选项元素与标准元素(例如复选框)很好地对齐。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多