Search code examples
androidpreferenceactivitypreference

Preferences of varying height within a PreferenceActivity


I have a custom class that extends Preference that I'm using in conjunction with a PreferenceActivity.

When I try to adjust the height in the layout my Preference is using (with a static layout_height or with wrap_content) it is always displayed in a uniform height cell in the Preference Activity - the same size that all of the "normal" preferences default to.

Is there a way present a given preference with a different layout_height.

I've looked at the API demos related to preferences and I'm not seeing anything that matches what I'm trying to do.


Solution

  • You can override getView(View, ViewGroup) in your Preference. Then send new LayoutParams to the getView(). I tried it with a customized CheckBoxPreference. Works great.

    import android.content.Context;
    import android.preference.CheckBoxPreference;
    import android.util.AttributeSet;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AbsListView.LayoutParams;
    
    
    public class CustomCheckBoxPreference extends CheckBoxPreference {
    
    public CustomCheckBoxPreference(final Context context, final AttributeSet attrs,
            final int defStyle) {
        super(context, attrs, defStyle);
    }
    
    public CustomCheckBoxPreference(final Context context, final AttributeSet attrs) {
        super(context, attrs);
    }
    
    public CustomCheckBoxPreference(final Context context) {
        super(context);
    }
    
    @Override
    public View getView(final View convertView, final ViewGroup parent) {
        final View v = super.getView(convertView, parent);
        final int height = android.view.ViewGroup.LayoutParams.MATCH_PARENT;
        final int width = 300;
        final LayoutParams params = new LayoutParams(height, width);
        v.setLayoutParams(params );
        return v;
    }
    

    }

    Just be careful to use the correct LayoutParams for the View or you might get a class cast exception.