Android Open Source - GreenDroid Segmented Host






From Project

Back to project page GreenDroid.

License

The source code is released under:

Apache License

If you think the Android project GreenDroid 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

/*
 * Copyright (C) 2010 Cyril Mottier (http://www.cyrilmottier.com)
 *//from  w w w.  j av  a 2 s . co  m
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package greendroid.widget;

import greendroid.util.Config;
import greendroid.widget.SegmentedBar.OnSegmentChangeListener;
import android.content.Context;
import android.content.res.TypedArray;
import android.database.DataSetObserver;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;

import com.cyrilmottier.android.greendroid.R;

/**
 * A SegmentedHost is a wrapper view that handle a SegmentedBar and a
 * FrameLayout that hold the content. Data (titles, and content Views) are
 * provided to the SegmentedHost via a {@link SegmentedAdapter}.
 * 
 * @author Cyril Mottier
 */
public class SegmentedHost extends LinearLayout {

    private final static String LOG_TAG = SegmentedHost.class.getSimpleName();

    private int mSegmentedBarId;
    private SegmentedBar mSegmentedBar;
    private int mSegmentedHostId;
    private FrameLayout mContentView;
    private int mSelectedSegment;

    private SegmentedAdapter mAdapter;
    private View[] mViews;
    private DataSetObserver mSegmentObserver = new DataSetObserver() {

        public void onChanged() {
            setupSegmentedHost(mSelectedSegment);
        }

        public void onInvalidated() {
            // Do nothing - method never called
        }
    };

    public SegmentedHost(Context context) {
        this(context, null);
    }

    public SegmentedHost(Context context, AttributeSet attrs) {
        this(context, attrs, R.attr.gdSegmentedHostStyle);
    }

    public SegmentedHost(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs);
        initSegmentedView();

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SegmentedHost, defStyle, 0);

        mSegmentedBarId = a.getResourceId(R.styleable.SegmentedHost_segmentedBar, -1);
        if (mSegmentedBarId <= 0) {
            throw new IllegalArgumentException("The segmentedBar attribute is required and must refer "
                    + "to a valid child.");
        }

        mSegmentedHostId = a.getResourceId(R.styleable.SegmentedHost_segmentedContentView, -1);
        if (mSegmentedHostId <= 0) {
            throw new IllegalArgumentException("The segmentedHost attribute is required and must refer "
                    + "to a valid child.");
        }
    }

    private void initSegmentedView() {
        setOrientation(LinearLayout.VERTICAL);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        mSegmentedBar = (SegmentedBar) findViewById(mSegmentedBarId);
        if (mSegmentedBar == null) {
            throw new IllegalArgumentException("The segmentedBar attribute must refer to an existing child.");
        }
        mSegmentedBar.setOnSegmentChangeListener(new SegmentSwitcher());

        mContentView = (FrameLayout) findViewById(mSegmentedHostId);
        if (mContentView == null) {
            throw new IllegalArgumentException("The segmentedHost attribute must refer to an existing child.");
        } else if (!(mContentView instanceof FrameLayout)) {
            throw new RuntimeException("The segmentedHost attribute must refer to a FrameLayout");

        }
    }

    public SegmentedBar getSegmentedBar() {
        return mSegmentedBar;
    }

    public FrameLayout getContentView() {
        return mContentView;
    }

    public void setAdapter(SegmentedAdapter adapter) {

        if (mAdapter != null) {
            mAdapter.unregisterDataSetObserver(mSegmentObserver);
        }
        mAdapter = adapter;

        if (adapter != null) {
            mAdapter.registerDataSetObserver(mSegmentObserver);
        }
        setupSegmentedHost(0);
    }

    private void setupSegmentedHost(int selectedSegment) {

        if (Config.GD_INFO_LOGS_ENABLED) {
            Log.i(LOG_TAG, "Preparing the SegmentedHost with the segment " + selectedSegment);
        }

        mSegmentedBar.removeAllViews();
        mContentView.removeAllViews();
        mViews = null;

        if (mAdapter != null) {
            // Add all segments to the Segmentedbar
            final int count = mAdapter.getCount();
            for (int i = 0; i < count; i++) {
                mSegmentedBar.addSegment(mAdapter.getSegmentTitle(i));
            }

            if (selectedSegment < 0) {
                selectedSegment = 0;
            } else if (selectedSegment > count) {
                selectedSegment = count;
            }

            if (count > 0) {
                // Prepare the SegmentBar
                mViews = new View[count];
                mSegmentedBar.setCurrentSegment(selectedSegment);

                // And displays the first view
                setContentView(selectedSegment);
            }
        }
    }

    private class SegmentSwitcher implements OnSegmentChangeListener {
        public void onSegmentChange(int index, boolean clicked) {
            setContentView(index);
        }
    }

    private void setContentView(int index) {
        mSelectedSegment = index;
        mContentView.removeAllViews();
        if (mViews[index] == null) {
            mViews[index] = mAdapter.getView(index, SegmentedHost.this);
        }
        mContentView.addView(mViews[index]);
    }

}




Java Source Code List

com.cyrilmottier.android.gdcatalog.AboutActivity.java
com.cyrilmottier.android.gdcatalog.ActionBarActivity.java
com.cyrilmottier.android.gdcatalog.AsyncImageViewListActivity.java
com.cyrilmottier.android.gdcatalog.BasicItemActivity.java
com.cyrilmottier.android.gdcatalog.CatalogActivity.java
com.cyrilmottier.android.gdcatalog.CatalogApplication.java
com.cyrilmottier.android.gdcatalog.InfoTabActivity.java
com.cyrilmottier.android.gdcatalog.MapPinMapActivity.java
com.cyrilmottier.android.gdcatalog.PagedViewActivity.java
com.cyrilmottier.android.gdcatalog.QuickActionActivity.java
com.cyrilmottier.android.gdcatalog.SegmentedActivity.java
com.cyrilmottier.android.gdcatalog.SimpleAsyncImageViewActivity.java
com.cyrilmottier.android.gdcatalog.TabbedActionBarActivity.java
com.cyrilmottier.android.gdcatalog.TweakedItemViewActivity.java
com.cyrilmottier.android.gdcatalog.WebContentActivity.java
com.cyrilmottier.android.gdcatalog.XmlItemActivity.java
com.cyrilmottier.android.gdcatalog.widget.HeadedTextItemView.java
com.cyrilmottier.android.gdcatalog.widget.HeadedTextItem.java
greendroid.app.ActionBarActivity.java
greendroid.app.GDActivity.java
greendroid.app.GDApplication.java
greendroid.app.GDExpandableListActivity.java
greendroid.app.GDListActivity.java
greendroid.app.GDMapActivity.java
greendroid.app.GDTabActivity.java
greendroid.graphics.drawable.ActionBarDrawable.java
greendroid.graphics.drawable.DrawableStateSet.java
greendroid.graphics.drawable.MapPinDrawable.java
greendroid.image.ChainImageProcessor.java
greendroid.image.ImageCache.java
greendroid.image.ImageLoader.java
greendroid.image.ImageProcessor.java
greendroid.image.ImageRequest.java
greendroid.image.MaskImageProcessor.java
greendroid.image.ScaleImageProcessor.java
greendroid.util.Config.java
greendroid.util.GDUtils.java
greendroid.util.Md5Util.java
greendroid.util.Time.java
greendroid.widget.ActionBarHost.java
greendroid.widget.ActionBarItem.java
greendroid.widget.ActionBar.java
greendroid.widget.AsyncImageView.java
greendroid.widget.ItemAdapter.java
greendroid.widget.LoaderActionBarItem.java
greendroid.widget.NormalActionBarItem.java
greendroid.widget.PageIndicator.java
greendroid.widget.PagedAdapter.java
greendroid.widget.PagedView.java
greendroid.widget.QuickActionBar.java
greendroid.widget.QuickActionGrid.java
greendroid.widget.QuickActionWidget.java
greendroid.widget.QuickAction.java
greendroid.widget.SegmentedAdapter.java
greendroid.widget.SegmentedBar.java
greendroid.widget.SegmentedHost.java
greendroid.widget.item.DescriptionItem.java
greendroid.widget.item.DrawableItem.java
greendroid.widget.item.Item.java
greendroid.widget.item.LongTextItem.java
greendroid.widget.item.ProgressItem.java
greendroid.widget.item.SeparatorItem.java
greendroid.widget.item.SubtextItem.java
greendroid.widget.item.SubtitleItem.java
greendroid.widget.item.TextItem.java
greendroid.widget.item.ThumbnailItem.java
greendroid.widget.itemview.DescriptionItemView.java
greendroid.widget.itemview.DrawableItemView.java
greendroid.widget.itemview.ItemView.java
greendroid.widget.itemview.LongTextItemView.java
greendroid.widget.itemview.ProgressItemView.java
greendroid.widget.itemview.SeparatorItemView.java
greendroid.widget.itemview.SubtextItemView.java
greendroid.widget.itemview.SubtitleItemView.java
greendroid.widget.itemview.TextItemView.java
greendroid.widget.itemview.ThumbnailItemView.java