自定义一个带缩略图的背景图片设置的preference

时间:2022-11-17 18:59:12

自定义一个带缩略图的的preference
为了方便我们就直接继承自 Preference

package com.example.rindia.testapplication;

import android.content.Context;
import android.content.res.TypedArray;
import android.preference.Preference;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;

/** * Created by Rindia on 2017/12/26. */

public class Testprefence extends Preference{
    private String src;
    private static final String IMAGE_PICKER_PREFERENCE_IMGSRC = "Image_Picker_Preference_imgsrc";
    public Testprefence(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    public Testprefence(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }


    public Testprefence(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    private float mDensity;
    private void init(){
        mDensity = getContext().getResources().getDisplayMetrics().density;
    }
    @Override
    protected void onBindView(View view) {
        super.onBindView(view);
       ImageView mImageView = new ImageView(getContext());
       //这里的widgetFrame是preference自己加载的的一个view里面的子空控件,我们就直接把ImageView添加到这里了
        LinearLayout widgetFrame =(LinearLayout) view.findViewById(android.R.id.widget_frame);
        widgetFrame.setVisibility(View.VISIBLE);
        //设置边距
        ViewGroup.LayoutParams layoutParams = widgetFrame.getLayoutParams();
        layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
        layoutParams.width = (int) (80 * mDensity);
        widgetFrame.setLayoutParams(layoutParams);
        widgetFrame.setPadding(
                widgetFrame.getPaddingLeft(),
                widgetFrame.getPaddingTop(),
                (int) (mDensity * 4),
                widgetFrame.getPaddingBottom()
        );
        int count = widgetFrame.getChildCount();
        if (count > 0){
            widgetFrame.removeAllViews();
        }
        widgetFrame.addView(mImageView);
        widgetFrame.setMinimumWidth(0);
        int padding =  (int) (mDensity * 4);
        mImageView.setPadding(padding,padding,padding,padding);
        //使用sharedPreference找到图片路径,getSharedPreference这个方法不能在构造方法中使用否则会报错。
 mSrc =  getSharedPreferences().getString(IMAGE_PICKER_PREFERENCE_IMGSRC + getKey(),"");
//在这里我使用了Glide填充主要是为了方便,当然你也可以使用其他的方式,skipMemoryCache(true).diskCacheStrategy( DiskCacheStrategy.NONE )每次加载图片不要使用缓存
      Glide.with(getContext()).load(mSrc).skipMemoryCache(true).diskCacheStrategy( DiskCacheStrategy.NONE ).into(mImageView);        
    }
    public void setmSrc(String src){
        this.mSrc = src;
        getEditor().putString(IMAGE_PICKER_PREFERENCE_IMGSRC + getKey(),mSrc).commit();
        Glide.with(getContext()).load(mSrc).skipMemoryCache(true).diskCacheStrategy( DiskCacheStrategy.NONE ).into(mImageView);
    }
    public String getmSrc(){
        return mSrc;
    }
    public String getImageKey(){
    retrun IMAGE_PICKER_PREFERENCE_IMGSRC + getKey();
}

其实Preference就是对view的一个封装,自定义preference就是自定义view,我们还可以自定义属性,自定义样式。在这个例子里我们也可以直接将选择图片方法直接封装到preference里,做成ImagePickePreference。