-
package com.example.mainframework02.fragment;
-
import android.annotation.SuppressLint;
-
import android.app.Activity;
-
import android.app.FragmentManager;
-
import android.app.FragmentTransaction;
-
import android.os.Bundle;
-
import android.view.View;
-
import android.view.View.OnClickListener;
-
import android.widget.ImageButton;
-
import android.widget.LinearLayout;
-
import com.example.mainframework02.R;
-
public class FragmentMainActivity extends Activity implements OnClickListener
-
{
-
private MainTab02 mTab02;
-
private MainTab01 mTab01;
-
private MainTab03 mTab03;
-
private MainTab04 mTab04;
-
/**
-
* 底部四个按钮
-
*/
-
private LinearLayout mTabBtnWeixin;
-
private LinearLayout mTabBtnFrd;
-
private LinearLayout mTabBtnAddress;
-
private LinearLayout mTabBtnSettings;
-
/**
-
* 用于对Fragment进行管理
-
*/
-
private FragmentManager fragmentManager;
-
@SuppressLint(“NewApi”)
-
@Override
-
protected void onCreate(Bundle savedInstanceState)
-
{
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.fragment_main);
-
initViews();
-
fragmentManager = getFragmentManager();
-
setTabSelection(0);
-
}
-
private void initViews()
-
{
-
mTabBtnWeixin = (LinearLayout) findViewById(R.id.id_tab_bottom_weixin);
-
mTabBtnFrd = (LinearLayout) findViewById(R.id.id_tab_bottom_friend);
-
mTabBtnAddress = (LinearLayout) findViewById(R.id.id_tab_bottom_contact);
-
mTabBtnSettings = (LinearLayout) findViewById(R.id.id_tab_bottom_setting);
-
mTabBtnWeixin.setOnClickListener(this);
-
mTabBtnFrd.setOnClickListener(this);
-
mTabBtnAddress.setOnClickListener(this);
-
mTabBtnSettings.setOnClickListener(this);
-
}
-
@Override
-
public void onClick(View v)
-
{
-
switch (v.getId())
-
{
-
case R.id.id_tab_bottom_weixin:
-
setTabSelection(0);
-
break;
-
case R.id.id_tab_bottom_friend:
-
setTabSelection(1);
-
break;
-
case R.id.id_tab_bottom_contact:
-
setTabSelection(2);
-
break;
-
case R.id.id_tab_bottom_setting:
-
setTabSelection(3);
-
break;
-
default:
-
break;
-
}
-
}
-
/**
-
* 根据传入的index参数来设置选中的tab页。
-
*
-
*/
-
@SuppressLint(“NewApi”)
-
private void setTabSelection(int index)
-
{
-
// 重置按钮
-
resetBtn();
-
// 开启一个Fragment事务
-
FragmentTransaction transaction = fragmentManager.beginTransaction();
-
// 先隐藏掉所有的Fragment,以防止有多个Fragment显示在界面上的情况
-
hideFragments(transaction);
-
switch (index)
-
{
-
case 0:
-
// 当点击了消息tab时,改变控件的图片和文字颜色
-
((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
-
.setImageResource(R.drawable.tab_weixin_pressed);
-
if (mTab01 == null)
-
{
-
// 如果MessageFragment为空,则创建一个并添加到界面上
-
mTab01 = new MainTab01();
-
transaction.add(R.id.id_content, mTab01);
-
} else
-
{
-
// 如果MessageFragment不为空,则直接将它显示出来
-
transaction.show(mTab01);
-
}
-
break;
-
case 1:
-
// 当点击了消息tab时,改变控件的图片和文字颜色
-
((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
-
.setImageResource(R.drawable.tab_find_frd_pressed);
-
if (mTab02 == null)
-
{
-
// 如果MessageFragment为空,则创建一个并添加到界面上
-
mTab02 = new MainTab02();
-
transaction.add(R.id.id_content, mTab02);
-
} else
-
{
-
// 如果MessageFragment不为空,则直接将它显示出来
-
transaction.show(mTab02);
-
}
-
break;
-
case 2:
-
// 当点击了动态tab时,改变控件的图片和文字颜色
-
((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
-
.setImageResource(R.drawable.tab_address_pressed);
-
if (mTab03 == null)
-
{
-
// 如果NewsFragment为空,则创建一个并添加到界面上
-
mTab03 = new MainTab03();
-
transaction.add(R.id.id_content, mTab03);
-
} else
-
{
-
// 如果NewsFragment不为空,则直接将它显示出来
-
transaction.show(mTab03);
-
}
-
break;
-
case 3:
-
// 当点击了设置tab时,改变控件的图片和文字颜色
-
((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
-
.setImageResource(R.drawable.tab_settings_pressed);
-
if (mTab04 == null)
-
{
-
// 如果SettingFragment为空,则创建一个并添加到界面上
-
mTab04 = new MainTab04();
-
transaction.add(R.id.id_content, mTab04);
-
} else
-
{
-
// 如果SettingFragment不为空,则直接将它显示出来
-
transaction.show(mTab04);
-
}
-
break;
-
}
-
transaction.commit();
-
}
-
/**
-
* 清除掉所有的选中状态。
-
*/
-
private void resetBtn()
-
{
-
((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
-
.setImageResource(R.drawable.tab_weixin_normal);
-
((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
-
.setImageResource(R.drawable.tab_find_frd_normal);
-
((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
-
.setImageResource(R.drawable.tab_address_normal);
-
((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
-
.setImageResource(R.drawable.tab_settings_normal);
-
}
-
/**
-
* 将所有的Fragment都置为隐藏状态。
-
*
-
* @param transaction
-
* 用于对Fragment执行操作的事务
-
*/
-
@SuppressLint(“NewApi”)
-
private void hideFragments(FragmentTransaction transaction)
-
{
-
if (mTab01 != null)
-
{
-
transaction.hide(mTab01);
-
}
-
if (mTab02 != null)
-
{
-
transaction.hide(mTab02);
-
}
-
if (mTab03 != null)
-
{
-
transaction.hide(mTab03);
-
}
-
if (mTab04 != null)
-
{
-
transaction.hide(mTab04);
-
}
-
}
-
}
各个TabFragment,一共四个TabFragment,下面贴出两个,基本都一样。
[java] view plain copy
-
package com.example.mainframework02.fragment;
-
import android.annotation.SuppressLint;
-
import android.app.Fragment;
-
import android.os.Bundle;
-
import android.view.LayoutInflater;
-
import android.view.View;
-
import android.view.ViewGroup;
-
@SuppressLint(“NewApi”)
-
public class MainTab01 extends Fragment
-
{
-
@Override
-
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
-
{
-
return inflater.inflate(com.example.mainframework02.R.layout.main_tab_01, container, false);
-
}
-
}
[java] view plain copy
-
package com.example.mainframework02.fragment;
-
import android.annotation.SuppressLint;
-
import android.app.Fragment;
-
import android.os.Bundle;
-
import android.view.LayoutInflater;
-
import android.view.View;
-
import android.view.ViewGroup;
-
import com.example.mainframework02.R;
-
@SuppressLint(“NewApi”)
-
public class MainTab02 extends Fragment
-
{
-
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
-
{
-
return inflater.inflate(R.layout.main_tab_02, container, false);
-
}
-
}
评价:每个Fragment中的控件的处理,都是独立到各自的类中,相对来说主Activity简化了不少,可惜没有左右滑动的效果了。
3、ViewPager+Fragment实现
主要通过ViewPager和FragmentPagerAdapter一起来实现。
效果图:
代码:
主Activity
[java] view plain copy
-
package com.example.mainframework03;
-
import java.util.ArrayList;
-
import java.util.List;
-
import android.os.Bundle;
-
import android.support.v4.app.Fragment;
-
import android.support.v4.app.FragmentActivity;
-
import android.support.v4.app.FragmentPagerAdapter;
-
import android.support.v4.view.ViewPager;
-
import android.support.v4.view.ViewPager.OnPageChangeListener;
-
import android.widget.ImageButton;
-
import android.widget.LinearLayout;
-
public class MainActivity extends FragmentActivity
-
{
-
private ViewPager mViewPager;
-
private FragmentPagerAdapter mAdapter;
-
private List mFragments = new ArrayList();
-
/**
-
* 底部四个按钮
-
*/
-
private LinearLayout mTabBtnWeixin;
-
private LinearLayout mTabBtnFrd;
-
private LinearLayout mTabBtnAddress;
-
private LinearLayout mTabBtnSettings;
-
@Override
-
protected void onCreate(Bundle savedInstanceState)
-
{
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
-
initView();
-
mAdapter = new FragmentPagerAdapter(getSupportFragmentManager())
-
{
-
@Override
-
public int getCount()
-
{
-
return mFragments.size();
-
}
-
@Override
-
public Fragment getItem(int arg0)
-
{
-
return mFragments.get(arg0);
-
}
-
};
-
mViewPager.setAdapter(mAdapter);
-
mViewPager.setOnPageChangeListener(new OnPageChangeListener()
-
{
-
private int currentIndex;
-
@Override
-
public void onPageSelected(int position)
-
{
-
resetTabBtn();
-
switch (position)
-
{
-
case 0:
-
((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
-
.setImageResource(R.drawable.tab_weixin_pressed);
-
break;
-
case 1:
-
((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
-
.setImageResource(R.drawable.tab_find_frd_pressed);
-
break;
-
case 2:
-
((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
-
.setImageResource(R.drawable.tab_address_pressed);
-
break;
-
case 3:
-
((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
-
.setImageResource(R.drawable.tab_settings_pressed);
-
break;
-
}
-
currentIndex = position;
-
}
-
@Override
-
public void onPageScrolled(int arg0, float arg1, int arg2)
-
{
-
}
-
@Override
-
public void onPageScrollStateChanged(int arg0)
-
{
-
}
-
});
-
}
-
protected void resetTabBtn()
-
{
-
((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
-
.setImageResource(R.drawable.tab_weixin_normal);
-
((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
-
.setImageResource(R.drawable.tab_find_frd_normal);
-
((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
-
.setImageResource(R.drawable.tab_address_normal);
-
((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
-
.setImageResource(R.drawable.tab_settings_normal);
-
}
-
private void initView()
-
{
-
mTabBtnWeixin = (LinearLayout) findViewById(R.id.id_tab_bottom_weixin);
-
mTabBtnFrd = (LinearLayout) findViewById(R.id.id_tab_bottom_friend);
-
mTabBtnAddress = (LinearLayout) findViewById(R.id.id_tab_bottom_contact);
-
mTabBtnSettings = (LinearLayout) findViewById(R.id.id_tab_bottom_setting);
-
MainTab01 tab01 = new MainTab01();
-
MainTab02 tab02 = new MainTab02();
-
MainTab03 tab03 = new MainTab03();
-
MainTab04 tab04 = new MainTab04();
-
mFragments.add(tab01);
-
mFragments.add(tab02);
-
mFragments.add(tab03);
-
mFragments.add(tab04);
-
}
-
}
还有4个TabFragment,下面贴一个,四个基本一样
[java] view plain copy
-
package com.example.mainframework03;
-
import android.os.Bundle;
-
import android.support.v4.app.Fragment;
-
import android.view.LayoutInflater;
-
import android.view.View;
-
import android.view.ViewGroup;
-
public class MainTab01 extends Fragment
-
{
-
@Override
-
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
-
{
-
return inflater.inflate(R.layout.main_tab_01, container, false);
-
}
-
}
评价:实现效果和第一种效果一模一样,每个Fragment独自处理自己内部的逻辑,代码整洁很多,并且支持左右滑动。感觉是第一种和第二种的结合版本。
4、TabPageIndicator+ViewPager+FragmentPagerAdapter
实现方式和3是一致的,但是使用了TabPageIndicator作为tab的指示器,效果还是不错的,这个之前写过,就不再贴代码了。
效果图:
参考:Android 使用Fragment,ViewPagerIndicator 制作csdn app主要框架
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后
简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。
选定你想去的几家公司后,先去一些小的公司练练,学习下面试技巧,总结下,也算是熟悉下面试氛围,平时和同事或者产品PK时可以讲得头头是道,思路清晰至极,到了现场真的不一样,怎么描述你所做的一切,这绝对是个学术性问题!
面试过程一定要有礼貌!即使你觉得面试官不尊重你,经常打断你的讲解,或者你觉得他不如你,问的问题缺乏专业水平,你也一定要尊重他,谁叫现在是他选择你,等你拿到offer后就是你选择他了。
金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

最后
简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。
选定你想去的几家公司后,先去一些小的公司练练,学习下面试技巧,总结下,也算是熟悉下面试氛围,平时和同事或者产品PK时可以讲得头头是道,思路清晰至极,到了现场真的不一样,怎么描述你所做的一切,这绝对是个学术性问题!
面试过程一定要有礼貌!即使你觉得面试官不尊重你,经常打断你的讲解,或者你觉得他不如你,问的问题缺乏专业水平,你也一定要尊重他,谁叫现在是他选择你,等你拿到offer后就是你选择他了。
金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-CZCAwjx3-1713290010975)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!