自定义ActionBar源码

来源:互联网 发布:李晶团扇 淘宝店 编辑:程序博客网 时间:2024/05/22 08:42
/* * Copyright (C) 2010 Johan Nilsson <http://markupartist.com> * * 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 com.markupartist.android.widget;import java.util.LinkedList;import com.markupartist.android.widget.actionbar.R;import android.content.ActivityNotFoundException;import android.content.Context;import android.content.Intent;import android.content.res.TypedArray;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ProgressBar;import android.widget.RelativeLayout;import android.widget.TextView;import android.widget.Toast;public class ActionBar extends RelativeLayout implements OnClickListener {    private LayoutInflater mInflater;    private RelativeLayout mBarView;    private ImageView mLogoView;    private View mBackIndicator;    //private View mHomeView;    private TextView mTitleView;    private LinearLayout mActionsView;    private ImageButton mHomeBtn;    private RelativeLayout mHomeLayout;    private ProgressBar mProgress;    public ActionBar(Context context, AttributeSet attrs) {        super(context, attrs);        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);        mBarView = (RelativeLayout) mInflater.inflate(R.layout.actionbar, null);        addView(mBarView);        mLogoView = (ImageView) mBarView.findViewById(R.id.actionbar_home_logo);        mHomeLayout = (RelativeLayout) mBarView.findViewById(R.id.actionbar_home_bg);        mHomeBtn = (ImageButton) mBarView.findViewById(R.id.actionbar_home_btn);        mBackIndicator = mBarView.findViewById(R.id.actionbar_home_is_back);        mTitleView = (TextView) mBarView.findViewById(R.id.actionbar_title);        mActionsView = (LinearLayout) mBarView.findViewById(R.id.actionbar_actions);        mProgress = (ProgressBar) mBarView.findViewById(R.id.actionbar_progress);        TypedArray a = context.obtainStyledAttributes(attrs,                R.styleable.ActionBar);        CharSequence title = a.getString(R.styleable.ActionBar_title);        if (title != null) {            setTitle(title);        }        a.recycle();    }    public void setHomeAction(Action action) {        mHomeBtn.setOnClickListener(this);        mHomeBtn.setTag(action);        mHomeBtn.setImageResource(action.getDrawable());        mHomeLayout.setVisibility(View.VISIBLE);    }    public void clearHomeAction() {        mHomeLayout.setVisibility(View.GONE);    }    /**     * Shows the provided logo to the left in the action bar.     *      * This is meant to be used instead of the setHomeAction and does not draw     * a divider to the left of the provided logo.     *      * @param resId The drawable resource id     */    public void setHomeLogo(int resId) {        // TODO: Add possibility to add an IntentAction as well.        mLogoView.setImageResource(resId);        mLogoView.setVisibility(View.VISIBLE);        mHomeLayout.setVisibility(View.GONE);    }    /* Emulating Honeycomb, setdisplayHomeAsUpEnabled takes a boolean     * and toggles whether the "home" view should have a little triangle     * indicating "up" */    public void setDisplayHomeAsUpEnabled(boolean show) {        mBackIndicator.setVisibility(show? View.VISIBLE : View.GONE);    }    public void setTitle(CharSequence title) {        mTitleView.setText(title);    }    public void setTitle(int resid) {        mTitleView.setText(resid);    }    /**     * Set the enabled state of the progress bar.     *      * @param One of {@link View#VISIBLE}, {@link View#INVISIBLE},     *   or {@link View#GONE}.     */    public void setProgressBarVisibility(int visibility) {        mProgress.setVisibility(visibility);    }    /**     * Returns the visibility status for the progress bar.     *      * @param One of {@link View#VISIBLE}, {@link View#INVISIBLE},     *   or {@link View#GONE}.     */    public int getProgressBarVisibility() {        return mProgress.getVisibility();    }    /**     * Function to set a click listener for Title TextView     *      * @param listener the onClickListener     */    public void setOnTitleClickListener(OnClickListener listener) {        mTitleView.setOnClickListener(listener);    }    @Override    public void onClick(View view) {        final Object tag = view.getTag();        if (tag instanceof Action) {            final Action action = (Action) tag;            action.performAction(view);        }    }    /**     * Adds a list of {@link Action}s.     * @param actionList the actions to add     */    public void addActions(ActionList actionList) {        int actions = actionList.size();        for (int i = 0; i < actions; i++) {            addAction(actionList.get(i));        }    }    /**     * Adds a new {@link Action}.     * @param action the action to add     */    public void addAction(Action action) {        final int index = mActionsView.getChildCount();        addAction(action, index);    }    /**     * Adds a new {@link Action} at the specified index.     * @param action the action to add     * @param index the position at which to add the action     */    public void addAction(Action action, int index) {        mActionsView.addView(inflateAction(action), index);    }    /**     * Removes all action views from this action bar     */    public void removeAllActions() {        mActionsView.removeAllViews();    }    /**     * Remove a action from the action bar.     * @param index position of action to remove     */    public void removeActionAt(int index) {        mActionsView.removeViewAt(index);    }    /**     * Remove a action from the action bar.     * @param action The action to remove     */    public void removeAction(Action action) {        int childCount = mActionsView.getChildCount();        for (int i = 0; i < childCount; i++) {            View view = mActionsView.getChildAt(i);            if (view != null) {                final Object tag = view.getTag();                if (tag instanceof Action && tag.equals(action)) {                    mActionsView.removeView(view);                }            }        }    }    /**     * Returns the number of actions currently registered with the action bar.     * @return action count     */    public int getActionCount() {        return mActionsView.getChildCount();    }    /**     * Inflates a {@link View} with the given {@link Action}.     * @param action the action to inflate     * @return a view     */    private View inflateAction(Action action) {        View view = mInflater.inflate(R.layout.actionbar_item, mActionsView, false);        ImageButton labelView =            (ImageButton) view.findViewById(R.id.actionbar_item);        labelView.setImageResource(action.getDrawable());        view.setTag(action);        view.setOnClickListener(this);        return view;    }    /**     * A {@link LinkedList} that holds a list of {@link Action}s.     */    public static class ActionList extends LinkedList<Action> {    }    /**     * Definition of an action that could be performed, along with a icon to     * show.     */    public interface Action {        public int getDrawable();        public void performAction(View view);    }    public static abstract class AbstractAction implements Action {        final private int mDrawable;        public AbstractAction(int drawable) {            mDrawable = drawable;        }        @Override        public int getDrawable() {            return mDrawable;        }    }    public static class IntentAction extends AbstractAction {        private Context mContext;        private Intent mIntent;        public IntentAction(Context context, Intent intent, int drawable) {            super(drawable);            mContext = context;            mIntent = intent;        }        @Override        public void performAction(View view) {            try {               mContext.startActivity(mIntent);             } catch (ActivityNotFoundException e) {                Toast.makeText(mContext,                        mContext.getText(R.string.actionbar_activity_not_found),                        Toast.LENGTH_SHORT).show();            }        }    }    /*    public static abstract class SearchAction extends AbstractAction {        public SearchAction() {            super(R.drawable.actionbar_search);        }    }    */}

ActionBar的使用:

package com.markupartist.android.actionbar.example;import com.markupartist.android.widget.ActionBar;import com.markupartist.android.widget.ActionBar.Action;import com.markupartist.android.widget.ActionBar.IntentAction;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class HomeActivity extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        final ActionBar actionBar = (ActionBar) findViewById(R.id.actionbar);        //actionBar.setHomeAction(new IntentAction(this, createIntent(this), R.drawable.ic_title_home_demo));        actionBar.setTitle("Home");        actionBar.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                // TODO Auto-generated method stub                System.out.println("我被点击了");            }        });        final Action shareAction = new IntentAction(this, createShareIntent(), R.drawable.ic_title_share_default);        actionBar.addAction(shareAction);        final Action otherAction = new IntentAction(this, new Intent(this, OtherActivity.class), R.drawable.ic_title_export_default);        actionBar.addAction(otherAction);        Button startProgress = (Button) findViewById(R.id.start_progress);        startProgress.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                actionBar.setProgressBarVisibility(View.VISIBLE);            }        });        Button stopProgress = (Button) findViewById(R.id.stop_progress);        stopProgress.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                actionBar.setProgressBarVisibility(View.GONE);            }        });        Button removeActions = (Button) findViewById(R.id.remove_actions);        removeActions.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View view) {                actionBar.removeAllActions();            }        });        Button addAction = (Button) findViewById(R.id.add_action);        addAction.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View view) {                actionBar.addAction(new Action() {                    @Override                    public void performAction(View view) {                        Toast.makeText(HomeActivity.this, "Added action.", Toast.LENGTH_SHORT).show();                    }                    @Override                    public int getDrawable() {                        return R.drawable.ic_title_share_default;                    }                });            }        });        Button removeAction = (Button) findViewById(R.id.remove_action);        removeAction.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View view) {                int actionCount = actionBar.getActionCount();                actionBar.removeActionAt(actionCount - 1);                Toast.makeText(HomeActivity.this, "Removed action." , Toast.LENGTH_SHORT).show();            }        });        Button removeShareAction = (Button) findViewById(R.id.remove_share_action);        removeShareAction.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View view) {                actionBar.removeAction(shareAction);            }        });    }    public static Intent createIntent(Context context) {        Intent i = new Intent(context, HomeActivity.class);        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        return i;    }    private Intent createShareIntent() {        final Intent intent = new Intent(Intent.ACTION_SEND);        intent.setType("text/plain");        intent.putExtra(Intent.EXTRA_TEXT, "Shared from the ActionBar widget.");        return Intent.createChooser(intent, "Share");    }}
0 0
原创粉丝点击