- 浏览: 500930 次
- 性别:
- 来自: 福州
文章分类
- 全部博客 (165)
- iphone (2)
- android (13)
- 设计模式 (8)
- ND实习小记之Android (63)
- mac使用技巧 (1)
- window phone (1)
- 错误总结 (2)
- 开发记录 (6)
- Android控件常用属性 (7)
- 代码管理工具 (5)
- 黑莓开发 (2)
- Eclipse (9)
- Android实践项目 (6)
- 常用布局 (1)
- 自定义Widget (5)
- adapter (2)
- OsChina Android客户端研究 (1)
- android之我见 (4)
- Java相关 (1)
- 存储 (1)
- 调试 (1)
- NDK相关 (2)
- App Components (7)
- Android_提醒 (2)
- Android_存储 (0)
- Android_线程 (3)
- Android控件使用实例 (5)
- 键盘相关 (1)
- android之我见,源码 (1)
最新评论
-
xy_feng_zhi_chao:
多谢楼主分享
Android中使用styles -
michaelye1988:
soldier93 写道无关素质,我只发表自己的看法!既然你发 ...
如何在window上把你的项目提交到github -
soldier93:
无关素质,我只发表自己的看法!既然你发表了博客我就有权对其评价 ...
如何在window上把你的项目提交到github -
michaelye1988:
soldier93 写道laji 素质真低
如何在window上把你的项目提交到github -
soldier93:
laji
如何在window上把你的项目提交到github
之前已经对SegmentBar进行了封装。之前的做法是通过在代码中new Button的方式来做。这样做的好处是封装性强,利于使用。但是也有弊端,就是针对较为复杂的布局的时候,实现起来就比较吃力,就算是实现了,以后维护起来也是比较麻烦的。这就是为什么我要写这篇博客的原因了。通过另一只方法来做。使用布局文件,通过inflate这个布局文件,得到里面的控件。
下面先看效果:
可以很清楚的看到,底部实际上就是一个SegmentBar,但是,如果要加上那个红色的小图标,就比较麻烦了。
下面上代码:
BottomBar.java
import java.util.ArrayList; import java.util.List; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import com.michael.main.R; /** * 将状态条单独封装起来 * * 这种封装方式和封装类似iPhone的SegmentBar不太一样,不是在代码中生成Button。 * 这里与布局文件相结合。通过inflater布局文件,来得到每个Item。 * * @author MichaelYe * @since 2012-9-5 * */ public class BottomBar extends LinearLayout implements OnClickListener { private static final int TAG_0 = 0; private static final int TAG_1 = 1; private static final int TAG_2 = 2; private static final int TAG_3 = 3; private static final int TAG_4 = 4; private Context mContext; private TextView tvOne; public BottomBar(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; init(); } public BottomBar(Context context) { super(context); mContext = context; init(); } private List<View> itemList; /** * get the buttons from layout * * 得到布局文件中的按钮 * * */ private void init() { LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(R.layout.bottom_bar, null); layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1.0f)); tvOne = (TextView)layout.findViewById(R.id.tv_warming); Button btnOne = (Button)layout.findViewById(R.id.btn_item_one); Button btnTwo = (Button)layout.findViewById(R.id.btn_item_two); Button btnThree = (Button)layout.findViewById(R.id.btn_item_three); Button btnFour = (Button)layout.findViewById(R.id.btn_item_four); Button btnFive = (Button)layout.findViewById(R.id.btn_item_five); btnOne.setOnClickListener(this); btnTwo.setOnClickListener(this); btnThree.setOnClickListener(this); btnFour.setOnClickListener(this); btnFive.setOnClickListener(this); btnOne.setTag(TAG_0); btnTwo.setTag(TAG_1); btnThree.setTag(TAG_2); btnFour.setTag(TAG_3); btnFive.setTag(TAG_4); itemList = new ArrayList<View>(); itemList.add(btnOne); itemList.add(btnTwo); itemList.add(btnThree); itemList.add(btnFour); itemList.add(btnFive); this.addView(layout); } @Override public void onClick(View v) { int tag = (Integer)v.getTag(); switch (tag) { case TAG_0: setNormalState(lastButton); setSelectedState(tag); break; case TAG_1: setNormalState(lastButton); setSelectedState(tag); break; case TAG_2: setNormalState(lastButton); setSelectedState(tag); break; case TAG_3: setNormalState(lastButton); setSelectedState(tag); break; case TAG_4: setNormalState(lastButton); setSelectedState(tag); break; } } private int lastButton = -1; /** * set the default bar item of selected * * 设置默认选中的Item * * */ public void setSelectedState(int index) { if(index != -1 && onItemChangedListener != null) { if(index > itemList.size()) { throw new RuntimeException("the value of default bar item can not bigger than string array's length"); } itemList.get(index).setSelected(true); onItemChangedListener.onItemChanged(index); lastButton = index; } } /** * set the normal state of the button by given index * * 恢复未选中状态 * * */ private void setNormalState(int index) { if(index != -1) { if(index > itemList.size()) { throw new RuntimeException("the value of default bar item can not bigger than string array's length"); } itemList.get(index).setSelected(false); } } /** * make the red indicate VISIBLE * * 设置我执行按钮右上角的红色小图标的可见 * * */ public void showIndicate(int value) { tvOne.setText(value + ""); tvOne.setVisibility(View.VISIBLE); } /** * make the red indicate GONE * * 隐藏 我执行按钮右上角的红色小图标 * * */ public void hideIndicate() { tvOne.setVisibility(View.GONE); } public interface OnItemChangedListener { public void onItemChanged(int index); } private OnItemChangedListener onItemChangedListener; public void setOnItemChangedListener(OnItemChangedListener onItemChangedListener) { this.onItemChangedListener = onItemChangedListener; } }
布局文件:
bottom_bar.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" android:background="@drawable/bg_bottom" android:gravity="center" android:orientation="horizontal" > <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" > <Button android:id="@+id/btn_item_one" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/bottom_item_selector" android:drawableTop="@drawable/bottom_bar_icon_me_selector" android:text="@string/bottom_item_one" android:textColor="@color/bottom_item_text_selector" android:textSize="12sp" /> <TextView android:id="@+id/tv_warming" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:background="@drawable/bottom_item_warming_icon" android:gravity="center" android:textColor="@android:color/white" android:textSize="13sp" android:textStyle="bold" android:visibility="gone" /> </RelativeLayout> <View android:layout_width="0.5dip" android:layout_height="fill_parent" android:layout_marginTop="8dip" android:background="@color/bottom_item_line_color" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" > <Button android:id="@+id/btn_item_two" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/bottom_item_selector" android:drawableTop="@drawable/bottom_bar_icon_me_selector" android:text="@string/bottom_item_two" android:textColor="@color/bottom_item_text_selector" android:textSize="12sp" /> </RelativeLayout> <View android:layout_width="0.5dip" android:layout_height="fill_parent" android:layout_marginTop="8dip" android:background="@color/bottom_item_line_color" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" > <Button android:id="@+id/btn_item_three" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/bottom_item_selector" android:drawableTop="@drawable/bottom_bar_icon_team_selector" android:text="@string/bottom_item_three" android:textColor="@color/bottom_item_text_selector" android:textSize="12sp" /> </RelativeLayout> <View android:layout_width="0.5dip" android:layout_height="fill_parent" android:layout_marginTop="8dip" android:background="@color/bottom_item_line_color" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" > <Button android:id="@+id/btn_item_four" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/bottom_item_selector" android:drawableTop="@drawable/bottom_bar_icon_search_selector" android:text="@string/bottom_item_four" android:textColor="@color/bottom_item_text_selector" android:textSize="12sp" /> </RelativeLayout> <View android:layout_width="0.5dip" android:layout_height="fill_parent" android:layout_marginTop="8dip" android:background="@color/bottom_item_line_color" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" > <Button android:id="@+id/btn_item_five" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/bottom_item_selector" android:drawableTop="@drawable/bottom_bar_icon_set_selector" android:text="@string/bottom_item_five" android:textColor="@color/bottom_item_text_selector" android:textSize="12sp" /> </RelativeLayout> </LinearLayout>
MainActivity.java
/** * * 这种方式和前面两种的封装方式又有所不同,前面两张是在代码中生成Button, * 而这种事通过布局文件来生成Button,效果都一样,但是布局文件更灵活, * 可以实现一些代码中难以实现的效果,比如在按钮的右上角加上一个小图标指示器等较为复杂的布局效果 * * @author MichaelYe * @since 2012-9-5 * * */ public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView tvShow = (TextView)findViewById(R.id.tv_show); final BottomBar bottomBar = (BottomBar)findViewById(R.id.ll_bottom_bar); bottomBar.setOnItemChangedListener(new OnItemChangedListener() { @Override public void onItemChanged(int index) { tvShow.setText(index+""); } }); bottomBar.setSelectedState(0); final Button btnShowOrHideIndicate = (Button)findViewById(R.id.btn_show_or_hide_indicate); btnShowOrHideIndicate.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(btnShowOrHideIndicate.getText().equals("显示图标")) { btnShowOrHideIndicate.setText("隐藏图标"); bottomBar.showIndicate(12); } else { btnShowOrHideIndicate.setText("显示图标"); bottomBar.hideIndicate(); } } }); } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/bg_login" android:orientation="vertical" > <RelativeLayout android:id="@+id/rl_title" android:layout_width="fill_parent" android:layout_height="45dip" android:layout_alignParentTop="true" android:layout_centerVertical="true" android:background="@drawable/bg_title_bar" android:gravity="center" > <Button android:id="@+id/btn_back" android:layout_width="70dip" android:layout_height="fill_parent" android:layout_alignParentLeft="true" android:layout_marginBottom="5dip" android:layout_marginLeft="8dip" android:layout_marginTop="5dip" android:background="@drawable/title_btn_back_selector" android:text="@string/workbench_home_page" android:textColor="@color/title_button_color_gray" /> <Button android:id="@+id/btn_add" android:layout_width="70dip" android:layout_height="fill_parent" android:layout_alignParentRight="true" android:layout_marginBottom="5dip" android:layout_marginRight="8dip" android:layout_marginTop="5dip" android:background="@drawable/title_btn_rect_selector" android:text="@string/workbench_add_task" android:textColor="@color/title_button_color_gray" /> <TextView android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_centerInParent="true" android:gravity="center" android:text="@string/workbench_title" android:textColor="@color/title_color_white" android:textSize="22sp" /> </RelativeLayout> <TextView android:id="@+id/tv_show" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textColor="@color/title_color_white" android:textSize="30sp" /> <Button android:id="@+id/btn_show_or_hide_indicate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/tv_show" android:text="@string/button_text" /> <com.michael.widget.BottomBar android:id="@+id/ll_bottom_bar" android:layout_width="fill_parent" android:layout_height="60dip" android:layout_alignParentBottom="true" /> </RelativeLayout>
也许你会问,如何能让红色的小图标显示在BottomBar的上方呢?实际上这里我对图片做了手脚,利用photoshop将原图片的顶部加入一款透明的约10个像素的空间就可以啦!也就是让原有的图片变得更高。哈哈,明白了吧?这样红色的小图标就可以显示出在BottomBar上方的效果了。
项目下载地址:
https://github.com/michaelye/DemoSegmentBarWithIndicate
相关推荐
通过使用BottomBar,开发者可以轻松地在应用中集成类似于Google官方应用的底部菜单,提供五彩缤纷的图标和动态效果。 首先,我们来了解如何在项目中集成BottomBar。要在Android Studio中引入BottomBar,你需要在...
BottomBar底部导航控件为用户提供了一种直观的方式来浏览应用的主要功能,通常包含3到5个图标,每个图标对应一个不同的页面或功能。这种设计风格在许多现代移动应用中广泛使用,因为它允许用户快速切换不同部分,...
在这个“BottomBar小例子”中,我们将深入探讨如何在Android项目中实现和自定义BottomBar。 首先,BottomBar的设计初衷是为了提供一个美观、易于使用的界面元素,它通常包含3到5个图标,每个图标代表一个应用程序的...
BottomBar是Android中一种流行的设计组件,它位于屏幕底部,通常包含3到5个图标和对应的标签,用于在主要功能之间进行切换。BottomBar的设计遵循Material Design规范,提供了美观且易于使用的导航方式。每个图标代表...
BottomBar是一款在GitHub上开源的Android库,专用于创建炫酷且实用的底部导航菜单。这个库为开发者提供了简单易用的方式,使他们能够在Android应用中实现类似iOS的TabBar功能,即在屏幕底部显示一组可点击的图标,...
BottomBar是Android开发中常用的底部导航栏组件,它提供了一种美观且易于定制的方式来实现应用内的多页面切换。GitHub上的项目由开发者roughike创建并维护,这个组件深受开发者喜爱,因为它具有高度可定制性,可以...
【Android-bottombar仿闲鱼底部导航支持本地和网络图片】是一个专门为Android应用设计的组件库,它实现了类似闲鱼应用的底部导航栏功能,并且具备加载本地和网络图片的能力。这个组件可以帮助开发者轻松地在应用中...
在这个场景中,"BottomBar"可能是一个自定义实现的UI组件库,专门用于创建底部导航栏。这样的库通常会提供预定义的样式、交互效果和便捷的方法来添加和管理底部栏的各个部分。 2. **Fragment**: Fragment是...
BottomBar Version 2.0 released! The latest version before that can be found in the v1 branch Cleaner code and better APIs No more unnecessary stuff or spaghetti mess Now the look, feel and ...
BottomBar 是一个专门为 Android 平台设计的第三方库,它为开发者提供了一种优雅的方式,来实现类似原生 Material Design 底部导航栏(Bottom Navigation)的效果。这个库是独立的,意味着它不依赖于任何特定的应用...
app底部导航栏 使用: 添加依赖 1.项目gradle添加一下配置: allprojects { repositories { ... maven { url 'https://jitpack.io' } } } 2.module中的gradle添加依赖: dependencies { implementation '...
目前市场上的App,几乎都有底部页签导航栏,所以我们在开发的时候经常需要用到这个,虽然github上有不少已经封装好的底部导航栏的工具,例如bottombar,alphaIndicator(仿微信滑动渐变底部控件)等,但是这些控件由于...
在IT行业中,构建类似微博的BottomBar是一种常见的需求,它是一个位于应用底部的导航栏,通常包含多个图标和标签,用户可以通过点击不同的图标在各个功能模块之间切换。本篇文章将详细探讨如何实现这样一个功能,...
以前用fragment都喜欢用support.v4.app.Fragment 这是为了兼容3.0以下,又搓又不好用, 其实现在不用 3.0以下的手机都已经没人用了。直接用app.fragment即可。该源码以最简单的方式实现了底部导航菜单。
本篇文章将详细讲解如何利用BottomBar、ViewPager和Fragment来实现这种炫酷的底部导航功能。 首先,BottomBar是一个在GitHub上开源的Android库,由roughike开发。它提供了一种优雅的方式来实现类似iOS中的TabBar...
2. 创建底部Tab的配置文件res/xml/bottombar_tabs.xml: > icon:Tab的图片,注意图片不能是透明的,不能存在padding, 可使用Generic Icon Generator生成, > 选择“Trim”, Padding设置为0dp > > ...
bottomBar = { BottomNavigation { items.forEachIndexed { index, item -> BottomNavigationItem( selected = currentSelectedIndex == index, onClick = { onItemSelected(index) }, icon = { Icon(item....
在XML布局文件中,你需要一个BottomNavigationView,它是一个用于底部导航的视图,包含一系列的菜单项(图标和文字)。每个菜单项对应一个Fragment,同时设置一个ViewPager来显示切换的Fragment内容。 2. **...
消息数提醒通常需要与应用的数据模型相结合,当有新消息时,通过`BadgeView`或者在底部菜单图标上添加一个小红点来显示未读消息的数量。 3. 使用第三方库:还有一些第三方库,如`BottomBar`和`Material Design ...