<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:clipToPadding="true" android:background="@drawable/background_title" tools:context="yu.zmqc.followme.MainActivity">
<LinearLayout android:id="@+id/bottom_menu" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_alignParentBottom="true">
<TextView android:id="@+id/txt_main" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/tab_menu_main_bg" android:drawablePadding="3dp" android:drawableTop="@drawable/tab_menu_main_img" android:gravity="center" android:textColor="@drawable/tab_menu_main_txt" android:paddingTop="5dp" android:text="首页"/>
<TextView android:id="@+id/txt_clock" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/tab_menu_clock_bg" android:drawablePadding="3dp" android:drawableTop="@drawable/tab_menu_clock_img" android:gravity="center" android:textColor="@drawable/tab_menu_clock_txt" android:paddingTop="5dp" android:text="收藏"/>
<TextView android:id="@+id/txt_search" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/tab_menu_main_bg" android:drawablePadding="3dp" android:drawableTop="@drawable/tab_menu_search_img" android:gravity="center" android:textColor="@drawable/tab_menu_main_txt" android:paddingTop="5dp" android:text="搜索"/>
<TextView android:id="@+id/txt_user" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/tab_menu_main_bg" android:drawablePadding="3dp" android:drawableTop="@drawable/tab_menu_user_img" android:gravity="center" android:textColor="@drawable/tab_menu_main_txt" android:paddingTop="5dp" android:text="我"/>
LinearLayout>
<FrameLayout android:id="@+id/main_fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/bottom_menu" android:background="#F1F1F1">
FrameLayout>
RelativeLayout>
该文件已经经过了删减,如截图有一些不同,通过布局可以看出主布局主要包含四个textView和一个FrameLayout(用来包含Fragment)
Fragment布局文件fragment_main_xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >
<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#BED4F1" android:orientation="horizontal" android:id="@+id/line" >
LinearLayout>
<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/line" android:id="@+id/line2" >
<ListView android:id="@+id/main_listview" android:layout_width="wrap_content" android:layout_height="wrap_content" />
LinearLayout>
RelativeLayout>
其实该部分的代码没有太多的意义,针对你的不同需求,可以将该部分改成你需要的页面布局,其余的四个布局也就不一一贴出了。
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//底部四个点击TextView
private TextView txt_main;
private TextView txt_clock;
private TextView txt_search;
private TextView txt_user;
//fragmet嵌入在这里
private FrameLayout main_frameLayout;
//Fragment管理
private FragmentManager fragmentManager;
//Fragment类
private MainFragment mainFragment;
private ClockFragment clockFragment;
private SearchFragment searchFragment;
private UserFragment userFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
}
private void initUI(){
txt_main = (TextView)findViewById(R.id.txt_main);
txt_clock = (TextView)findViewById(R.id.txt_clock);
txt_search = (TextView)findViewById(R.id.txt_search);
txt_user = (TextView)findViewById(R.id.txt_user);
//framlayout获取
main_frameLayout = (FrameLayout)findViewById(R.id.main_fragment_container);
//设置监听器
txt_main.setOnClickListener(this);
txt_user.setOnClickListener(this);
txt_search.setOnClickListener(this);
txt_clock.setOnClickListener(this);
fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
mainFragment = new MainFragment();
transaction.add(R.id.main_fragment_container,mainFragment);
transaction.commit();
txt_main.setSelected(true);
}
@Override
public void onClick(View view) {
//v4包导入getSupportFragmentManager,app包使用getFragmentManager,app包3.0后才使用
fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
hideAllFragment(transaction);
switch (view.getId()){
case R.id.txt_main:
reTxtSelect();
txt_main.setSelected(true);
if(mainFragment==null){
mainFragment = new MainFragment();
transaction.add(R.id.main_fragment_container,mainFragment);
}else{
transaction.show(mainFragment);
}
break;
case R.id.txt_clock:
reTxtSelect();
txt_clock.setSelected(true);
if(clockFragment==null){
clockFragment = new ClockFragment();
transaction.add(R.id.main_fragment_container,clockFragment);
}else{
transaction.show(clockFragment);
}
break;
case R.id.txt_search:
reTxtSelect();
txt_search.setSelected(true);
if(searchFragment==null){
searchFragment = new SearchFragment();
transaction.add(R.id.main_fragment_container,searchFragment);
}else{
transaction.show(searchFragment);
}
break;
case R.id.txt_user:
reTxtSelect();
txt_user.setSelected(true);
if(userFragment==null){
userFragment = new UserFragment();
transaction.add(R.id.main_fragment_container,userFragment);
}else{
transaction.show(userFragment);
}
break;
}
transaction.commit();
}
//初始化底部菜单选择状态
private void reTxtSelect(){
txt_main.setSelected(false);
txt_clock.setSelected(false);
txt_search.setSelected(false);
txt_user.setSelected(false);
}
//隐藏所有Fragment
public void hideAllFragment(FragmentTransaction transaction){
if(mainFragment!=null){
transaction.hide(mainFragment);
}
if(clockFragment!=null){
transaction.hide(clockFragment);
}
if(searchFragment!=null){
transaction.hide(searchFragment);
}
if(userFragment!=null){
transaction.hide(userFragment);
}
}
}
主类的主要步骤就是获得布局中的四个TextView,然后根据监听点击事件动态切换不同的Fragment。
Fragment类主要代码如下,因为具体的实现需要你自己去添加,该部分只需要一个思路即可:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main,container,false);
return view;
}
4.一些注意事项
前面主要从思路代码进行了具体的分析,经过简单的修正,我还是自己动手写了一个demo出来,供初学者使用,项目基本包含,一个MainActivity,一个主布局activity_main.xml和四个fragment布局,项目地址在文末给出,实现的具体效果如下:
除此之外分享几个项目编写过程中的注意事项,首先给大家一个下载app图标地址(点击就可以跳转),我们可以在该网站找到自己需要的图标,还支持自定义编辑,简直是程序员的福音。
项目中底部图标使用TextView中的drawableTop属性添加图片,图片采用xml的形式,也即是有点击选中效果,drawablePadding属性主要是设置图片与文字的距离,建议高宽选择wrap_content,因为当你选择match_parent时,无论怎么调整距离都会使得图片跟文字拉的很远,这也是实际开发中遇到的,如果要想使得空白距变大,那再添加一个线性布局吧,可能有更好的方法欢迎大家指教,下面是图片的xml文件,该文件作为底部导航点击文本的drawableTop文件,其中项目中还涉及到了背景的选中变色和字体的选中变色,大体的思路一样:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/home_" android:state_selected="true" />
<item android:drawable="@mipmap/home"/>
selector>
具体可以参照项目中的实现
5.项目文件
Android studio2.2开发工具
百度云
CSDN