自定义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
- 自定义ActionBar源码
- 自定义 ActionBar
- 自定义actionBar
- 自定义actionbar
- 自定义actionbar
- 自定义Actionbar
- 自定义ActionBar
- 自定义ActionBar
- 自定义ActionBar
- 自定义Actionbar
- 自定义actionbar
- ActionBar自定义
- 自定义ActionBar
- 自定义ActionBar
- ActionBar自定义
- 自定义actionBar
- Android自定义ActionBar背景颜色(从源码分析)
- 自定义ActionBar,ActionBar标题居中
- android SQLite数据库及SQLiteOpenHelper
- 一位俄罗斯程序员移民美国的故事
- zend framework2-不同模块设置不同layout
- 黑马程序员--OC内存管理之循环retain问题
- 课程实训(猜猜看游戏)进度三
- 自定义ActionBar源码
- 黑马程序员-OC语言-SEL类型(听课笔记)
- malloc, realloc, calloc, alloca
- ios教程(3)--UIImageView、UILabel、UIButton实现一个小案例
- jsp (一)
- 用虚拟机安装、启动、停用hadoop2.6.0(实现hdfsHA和ResourceManagerHA)步骤小记
- 百度分页效果之纯jsp版
- 黑马程序员--有关OC内存管路set方法的思考
- 计算机专业英语教程(第二版)