欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(一)MyWeChat

程序员文章站 2022-05-14 08:03:28
...

项目效果展示

实现微信的底部按钮切换

(一)MyWeChat

项目环境

  • AS3.5.2
  • API 21:Android 5.0

项目步骤

开始前

  • 将模式改为非兼容
    extends Activity

  • 消除App左上角的title

    import android.view.Window;
    
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
    
  • 将项目需要用到的图标放到res->drawable

编写所有的layout文件

(一)MyWeChat

这里不多赘述,主要写一下流程及可能碰到的坑

  • top.xml很简单只有一个文本框

  • 四个tab.xml也只有一个文本框,即中间要显示的页面

  • bottom.xml稍微复杂一点,里面放了四个LinearLayout,分别放了一个ImageButton和一个TextView

    android:gravity="center" //只有选择这个下面的文字才能居中,而不是layout_gravity
    
    android:clickable="false" //小控件配置一个这个才能最后实现区域点击
    
    android:src="@drawable/tab_weixin_pressed"//这是正确版本 兼容版本显示不出图片
    app:srcCompat="@drawable/tab_weixin_pressed"
    
  • activity_main.xml

    <include layout="@layout/top" />
    
    <FrameLayout
    android:id="@+id/id_content"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    
    android:layout_weight="1"></FrameLayout>
    
    <include layout="@layout/bottom" />
    

    将上下两个layout插进来,中间模块的layout可以层叠

编写所有的Java文件

(一)MyWeChat

创建Fragment文件

  • 创建一个空白的Fragment(别的不要,同时生成一个xml,一会儿删掉)

  • ->refactor->rename

  • 更新一下layout的指向

    return inflater.inflate(R.layout.tab01, container, false);
    
  • 这里引用的包要更换

    import android.app.Fragment;
    

    包括MainActivity里的这个包也要更换,Androidx的很多包不合适
    为什么不用Androidx

  • 通过Fragment把xml作为对象来进行控制

写MainActivity里的代码

  • 创建Fragment对象

    private Fragment mTab01 = new weixinFragment();
    private Fragment mTab02 = new frdFragment();
    private Fragment mTab03 = new contactFragment();
    private Fragment mTab04 = new settingsFragment();
    
  • 初始化FragmentManager

    private FragmentManager fm;
    
    private void initFragment(){
            fm = getFragmentManager();
            FragmentTransaction transaction = fm.beginTransaction();
            transaction.add(R.id.id_content,mTab01);
            transaction.add(R.id.id_content,mTab02);
            transaction.add(R.id.id_content,mTab03);
            transaction.add(R.id.id_content,mTab04);
            transaction.commit();
        }
    
  • 创建LinearLayout对象和ImageButton对象

    private LinearLayout mTabWeixin;
    private LinearLayout mTabFrd;
    private LinearLayout mTabAddress;
    private LinearLayout mTabSettings;
    
    private ImageButton mImgWeixin;
    private ImageButton mImgFrd;
    private ImageButton mImgAddress;
    private ImageButton mImgSettings;
    
  • 初始化视图

    private void initView(){
        mTabWeixin = (LinearLayout)findViewById(R.id.id_tab_weixin);
        mTabFrd = (LinearLayout)findViewById(R.id.id_tab_frd);
        mTabAddress=(LinearLayout)findViewById(R.id.id_tab_contact);
        mTabSettings=(LinearLayout)findViewById(R.id.id_tab_settings);
    
        mImgWeixin=(ImageButton)findViewById(R.id.id_tab_weixin_img);
        mImgFrd=(ImageButton)findViewById(R.id.id_tab_frd_img);
        mImgAddress=(ImageButton)findViewById(R.id.id_tab_contact_img);
        mImgSettings=(ImageButton)findViewById(R.id.id_tab_settings_img);
    }
    
  • 写一个函数,隐藏所有的中间的部分叠加的文字,为下一个函数做准备

    private void hideFragment(FragmentTransaction transaction){
        transaction.hide(mTab01);
        transaction.hide(mTab02);
        transaction.hide(mTab03);
        transaction.hide(mTab04);
    }
    
  • 设置一个i来控制切换,选到谁,谁的图标就亮,并显示对应的文字

    private void selectFragment(int i){
        FragmentTransaction transaction = fm.beginTransaction();
        hideFragment(transaction);
        //把图片设置为亮的
        //设置内容区域
        switch (i){
            case 0:
                Log.d("setSelect","1");
                transaction.show(mTab01);
                mImgWeixin.setImageResource(R.drawable.tab_weixin_pressed);
                break;
            case 1:
                Log.d("setSelect","2");
                transaction.show(mTab02);
                mImgFrd.setImageResource(R.drawable.tab_find_frd_pressed);
                break;
            case 2:
                Log.d("setSelect","3");
                transaction.show(mTab03);
                mImgAddress.setImageResource(R.drawable.tab_address_pressed);
                break;
            case 3:
                Log.d("setSelect","4");
                transaction.show(mTab04);
                mImgSettings.setImageResource(R.drawable.tab_settings_pressed);
                break;
            default:
                break;
        }
        transaction.commit();
    }
    
  • 建立一个全活动的点击监听

    public class MainActivity extends Activity implements View.OnClickListener
        
    //要重写onClick函数,否则会报错
    
  • 写一个所有图标变灰色的函数

    public void resetImages(){
        mImgWeixin.setImageResource(R.drawable.tab_weixin_normal);
        mImgFrd.setImageResource(R.drawable.tab_find_frd_normal);
        mImgAddress.setImageResource(R.drawable.tab_address_normal);
        mImgSettings.setImageResource(R.drawable.tab_settings_normal);
    }
    
  • 重写onClick函数,点击切换

    @Override
    public void onClick(View view) {
        Log.d("onClick","1");
        resetImages();
        switch (view.getId()){
            case R.id.id_tab_weixin:
                selectFragment(0);
                break;
            case R.id.id_tab_frd:
                selectFragment(1);
                break;
            case R.id.id_tab_contact:
                selectFragment(2);
                break;
            case R.id.id_tab_settings:
                selectFragment(3);
                break;
            default:
                break;
        }
    }
    
  • 全屏监听很耗内存,将监听优化到局部

    private void initEvent(){
        mTabWeixin.setOnClickListener(this);
        mTabFrd.setOnClickListener(this);
        mTabAddress.setOnClickListener(this);
        mTabSettings.setOnClickListener(this);
    }
    
  • 展示一下onCreate函数

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
    
        initView();
        initFragment();
        initEvent();
        selectFragment(0);
    }
    

结语

本项目重点运用了Fragment以及学习了怎样进行切换,现将代码附后。

MyWeChat|Gitee

相关标签: Android基础