Addev
Addev

Reputation: 32243

custom ProgressBarPreference issue in Android

I'm trying to implement a custom ProgressBarPreference, adding at the bottom of a default preference a ProgressBar and a TextView, and granting the methods of the progressbar like setProgress() or setMax() for changing it. Here's my code works except the updating the progress within onCreate or onResume for example, how can I allow to set the progress in those points ? (actually is giving a null pointer exception over mProgressBar):

ProgressBarPreference.java

public class ProgressBarPreference extends Preference {


    public ProgressBarPreference(Context context) {
        super(context);
    }
    public ProgressBarPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ProgressBarPreference(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }

    ProgressBar mProgressBar;

    @Override
    protected View onCreateView(ViewGroup parent) {

        LayoutInflater li = (LayoutInflater) Manager.appcontext.getSystemService(Service.LAYOUT_INFLATER_SERVICE);
        View myLayout=li.inflate(R.layout.progressbarpreference, null, false);
                ((ViewGroup)myLayout.findViewById(R.id.preference_super_container)).addView(super.onCreateView(parent));
        mProgressBar=(ProgressBar) myLayout.findViewById(R.id.preference_progress_bar);
        return myLayout;
    }       
    public void setProgress(int value){
         mProgressBar.setProgress(value);

    }




}

progressbarpreference.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
>
    <LinearLayout
        android:id="@+id/preference_super_container"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:orientation="vertical"
    ></LinearLayout>

    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:paddingLeft="20sp"
        android:paddingRight="20sp"
    >
        <TextView
            android:layout_alignParentRight="true"
            android:text="0 new of 100"
            android:id="@+id/preference_progress_label"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:gravity="center"
            android:layout_centerVertical="true"
            android:paddingLeft="15sp"
            android:textColor="#FFFFFF"
        ></TextView>
        <ProgressBar
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:id="@+id/preference_progress_bar"
            android:layout_centerVertical="true"
            android:progress="50"
            android:layout_toLeftOf="@id/preference_progress_label"
            android:layout_alignParentLeft="true"
        ></ProgressBar>
    </RelativeLayout>

</LinearLayout>

Upvotes: 4

Views: 1323

Answers (1)

Addev
Addev

Reputation: 32243

Ok have a solution (Android does it with an OnPreferenceChangeInternalListener but this is an easy working solution)

public class ProgressBarPreference extends Preference {


    public ProgressBarPreference(Context context) {
        super(context);
    }
    public ProgressBarPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ProgressBarPreference(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }

    private ProgressBar mProgressBar;
    private TextView mLabel;
    private int lastReqProgress=-1;
    private int lastReqMax=-1;
    private String lastLabel;

    @Override
    protected View onCreateView(ViewGroup parent) {

        LayoutInflater li = (LayoutInflater) Manager.appcontext.getSystemService(Service.LAYOUT_INFLATER_SERVICE);
        View myLayout=li.inflate(R.layout.progressbarpreference, null, false);
                ((ViewGroup)myLayout.findViewById(R.id.preference_super_container)).addView(super.onCreateView(parent));
        mProgressBar=(ProgressBar) myLayout.findViewById(R.id.preference_progress_bar);
        mLabel=(TextView) myLayout.findViewById(R.id.preference_progress_label);
        if (lastReqProgress>-1){
            mProgressBar.setProgress(lastReqProgress);
        }
        if (lastReqMax>-1){
            mProgressBar.setMax(lastReqMax);
        }
        if (lastLabel!=null){
            mLabel.setText(lastLabel);
        }

        return myLayout;
    }


    public void setProgress(int value){
        if (mProgressBar!=null){
            mProgressBar.setProgress(value);
        } else {
            lastReqProgress=value;
        }

    }

    public void setMax(int value){
        if (mProgressBar!=null){
            int savedprogress=mProgressBar.getProgress();
            mProgressBar.setMax(0);
            mProgressBar.setMax(value);
            mProgressBar.setProgress(savedprogress);
        } else {
            lastReqMax=value;
        }

    }


    public void setLabel(String text){
        if (lastLabel!=null){
            mLabel.setText(text);
        } else {
            lastLabel=text;
        }
    }



}

Upvotes: 6

Related Questions