Android Open Source - SpareDeck Seek Bar Preference






From Project

Back to project page SpareDeck.

License

The source code is released under:

MIT License

If you think the Android project SpareDeck listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.robobunny;
// w  ww  .  j  a v a  2 s  . c om
import android.content.Context;
import android.content.res.TypedArray;
import android.preference.Preference;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

import com.hacsoft.sparedeck.R;

public class SeekBarPreference extends Preference implements OnSeekBarChangeListener
{
    private final String TAG = getClass().getName();

    private static final String ANDROIDNS     = "http://schemas.android.com/apk/res/android";
    private static final String APPLICATIONNS = "http://robobunny.com";
    private static final int    DEFAULT_VALUE = 50;

    private int mMaxValue = 100;
    private int mMinValue = 0;
    private int mInterval = 1;
    private int mCurrentValue;
    private String mUnitsLeft  = "";
    private String mUnitsRight = "";
    private SeekBar mSeekBar;

    private TextView mStatusText;

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

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

    private void initPreference( Context context, AttributeSet attrs )
    {
        setValuesFromXml( attrs );
        mSeekBar = new SeekBar( context, attrs );
        mSeekBar.setMax( mMaxValue - mMinValue );
        mSeekBar.setOnSeekBarChangeListener( this );

        setWidgetLayoutResource( R.layout.seek_bar_preference );
    }

    private void setValuesFromXml( AttributeSet attrs )
    {
        mMaxValue = attrs.getAttributeIntValue( ANDROIDNS, "max", 100 );
        mMinValue = attrs.getAttributeIntValue( APPLICATIONNS, "min", 0 );

        mUnitsLeft = getAttributeStringValue( attrs, APPLICATIONNS, "unitsLeft", "" );
        String units = getAttributeStringValue( attrs, APPLICATIONNS, "units", "" );
        mUnitsRight = getAttributeStringValue( attrs, APPLICATIONNS, "unitsRight", units );

        try {
            String newInterval = attrs.getAttributeValue( APPLICATIONNS, "interval" );
            if ( newInterval != null ) {
                mInterval = Integer.parseInt( newInterval );
            }
        }
        catch ( Exception e ) {
            Log.e( TAG, "Invalid interval value", e );
        }

    }

    private String getAttributeStringValue( AttributeSet attrs, String namespace, String name, String defaultValue )
    {
        String value = attrs.getAttributeValue( namespace, name );
        if ( value == null ) {
            value = defaultValue;
        }

        return value;
    }

    @Override
    protected View onCreateView( ViewGroup parent )
    {
        View view = super.onCreateView( parent );

        // The basic preference layout puts the widget frame to the right of the title and summary,
        // so we need to change it a bit - the seekbar should be under them.
        LinearLayout layout = (LinearLayout) view;
        layout.setOrientation( LinearLayout.VERTICAL );

        return view;
    }

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

        try {
            // move our seekbar to the new view we've been given
            ViewParent oldContainer = mSeekBar.getParent();
            ViewGroup newContainer = (ViewGroup) view.findViewById( R.id.seekBarPrefBarContainer );

            if ( oldContainer != newContainer ) {
                // remove the seekbar from the old view
                if ( oldContainer != null ) {
                    ( (ViewGroup) oldContainer ).removeView( mSeekBar );
                }
                // remove the existing seekbar (there may not be one) and add ours
                newContainer.removeAllViews();
                newContainer.addView( mSeekBar, ViewGroup.LayoutParams.FILL_PARENT,
                                      ViewGroup.LayoutParams.WRAP_CONTENT );
            }
        }
        catch ( Exception ex ) {
            Log.e( TAG, "Error binding view: " + ex.toString() );
        }

        //if dependency is false from the beginning, disable the seek bar
        if ( view != null && !view.isEnabled() ) {
            mSeekBar.setEnabled( false );
        }

        updateView( view );
    }

    /**
     * Update a SeekBarPreference view with our current state
     *
     * @param view
     */
    protected void updateView( View view )
    {

        try {
            mStatusText = (TextView) view.findViewById( R.id.seekBarPrefValue );

            mStatusText.setText( String.valueOf( mCurrentValue ) );
            mStatusText.setMinimumWidth( 30 );

            mSeekBar.setProgress( mCurrentValue - mMinValue );

            TextView unitsRight = (TextView) view.findViewById( R.id.seekBarPrefUnitsRight );
            unitsRight.setText( mUnitsRight );

            TextView unitsLeft = (TextView) view.findViewById( R.id.seekBarPrefUnitsLeft );
            unitsLeft.setText( mUnitsLeft );

        }
        catch ( Exception e ) {
            Log.e( TAG, "Error updating seek bar preference", e );
        }

    }

    @Override
    public void onProgressChanged( SeekBar seekBar, int progress, boolean fromUser )
    {
        int newValue = progress + mMinValue;

        if ( newValue > mMaxValue ) {
            newValue = mMaxValue;
        }
        else if ( newValue < mMinValue ) {
            newValue = mMinValue;
        }
        else if ( mInterval != 1 && newValue % mInterval != 0 ) {
            newValue = Math.round( ( (float) newValue ) / mInterval ) * mInterval;
        }

        // change rejected, revert to the previous value
        if ( !callChangeListener( newValue ) ) {
            seekBar.setProgress( mCurrentValue - mMinValue );
            return;
        }

        // change accepted, store it
        mCurrentValue = newValue;
        mStatusText.setText( String.valueOf( newValue ) );
        persistInt( newValue );

    }

    @Override
    public void onStartTrackingTouch( SeekBar seekBar )
    {
    }

    @Override
    public void onStopTrackingTouch( SeekBar seekBar )
    {
        notifyChanged();
    }


    @Override
    protected Object onGetDefaultValue( TypedArray ta, int index )
    {

        int defaultValue = ta.getInt( index, DEFAULT_VALUE );
        return defaultValue;

    }

    @Override
    protected void onSetInitialValue( boolean restoreValue, Object defaultValue )
    {

        if ( restoreValue ) {
            mCurrentValue = getPersistedInt( mCurrentValue );
        }
        else {
            int temp = 0;
            try {
                temp = (Integer) defaultValue;
            }
            catch ( Exception ex ) {
                Log.e( TAG, "Invalid default value: " + defaultValue.toString() );
            }

            persistInt( temp );
            mCurrentValue = temp;
        }

    }

    /**
     * make sure that the seekbar is disabled if the preference is disabled
     */
    @Override
    public void setEnabled( boolean enabled )
    {
        super.setEnabled( enabled );
        mSeekBar.setEnabled( enabled );
    }

    @Override
    public void onDependencyChanged( Preference dependency, boolean disableDependent )
    {
        super.onDependencyChanged( dependency, disableDependent );

        //Disable movement of seek bar when dependency is false
        if ( mSeekBar != null ) {
            mSeekBar.setEnabled( !disableDependent );
        }
    }
}




Java Source Code List

com.hacsoft.sparedeck.About.java
com.hacsoft.sparedeck.Card.java
com.hacsoft.sparedeck.DeckSelectAdapter.java
com.hacsoft.sparedeck.DeckViewer.java
com.hacsoft.sparedeck.Deck.java
com.hacsoft.sparedeck.ShowConfig.java
com.hacsoft.sparedeck.SpareDeck.java
com.hacsoft.sparedeck.decks.Card.java
com.hacsoft.sparedeck.decks.Deck.java
com.hacsoft.sparedeck.decks.IcarusDeck.java
com.hacsoft.sparedeck.decks.N3dsDeck.java
com.hacsoft.sparedeck.decks.VitaDeck.java
com.hacsoft.sparedeck.pokedex.CodeGridView.java
com.hacsoft.sparedeck.pokedex.PokedexActivity.java
com.robobunny.SeekBarPreference.java