| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> 移动开发 -> 移动开发第一次作业 -> 正文阅读 |
|
|
[移动开发]移动开发第一次作业 |
|
目录 代码仓库地址:https://github.com/ldaadl/AndroidDevelopment1.git一.作业要求实现APP门户框架设计,至少包含四个tab页,能实现top页之间的点击切换。 二.分析与实现1.分析我们需要设计一个类微信的界面,关键还是在于UI设计。微信界面的组成大致可以分为三部分:
顶栏和底栏内容相对固定,比较好解决,但是中间显示内容的部分在切换不同页面时变化很大,甚至布局都改变了,所以切换页面的效果肯定不能是通过修改中间部分的控件达成的,而是要将每个页面独立开来,这可以使用fragment实现。 2.具体实现a.XML文件部分fragment达成的功能无法直接通过XML文件实现,需要java和xml的结合,先按下不表。我们先说说比较好搞的顶栏和底栏。 顶栏:
顶栏可说的内容不多,直接在一个LinearLayout中增加一个TextView,然后调整字体大小、背景颜色即可。 XML代码需要注意的地方:
底栏:
底栏可以看出是一个纵向+横向的组合,每个纵向组合是一个LinearLayout内纵向放置一个ImageView+一个TextView组成,四个这样的纵向组合放入一个横向的LinearLayout达成我们想要的效果。
顶栏和底栏都可以各用一个XML文件编写,最后再在activity_main.xml中通过include引用。 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
? ?xmlns:app="http://schemas.android.com/apk/res-auto"
? ?xmlns:tools="http://schemas.android.com/tools"
? ?android:layout_width="match_parent"
? ?android:layout_height="match_parent"
? ?android:orientation="vertical"
? ?tools:context=".MainActivity">
? ?<!-- 引用顶栏的XML文件 -->
? ?<include layout="@layout/top" />
?
? ?<FrameLayout
? ? ? ?android:id="@+id/id_content"
? ? ? ?android:layout_width="match_parent"
? ? ? ?android:layout_height="match_parent"
? ? ? ?android:layout_weight="1"/>
? ?<!-- 引用底栏XML文件 -->
? ?<include layout="@layout/botton" />
</LinearLayout>
b.fragment先谈谈这次作业中用到的Fragment的一些概念:
构建Fragment的详细过程: 首先在MainActivity.java文件所在的目录下生成一个java类文件,文件中是Fragment的子类(操作:new->Fragment->Fragment(Blank)),同时layout文件夹下将会生成一个相应的xml文件。xml文件中是fragment的UI表现形式,我们要通过与之相应的Fragment子类文件和MainActivity文件将其加载到activity_main.xml的界面中。 fragment的xml文件这一次作业暂时不用管太多,里面设置一个TextView控件即可。我们主要来看看fragment相应的的类和Java文件中有关fragment的部分。 fragment类: package com.example.mywork1_lda;
?
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
?
?
public class FragmentMessage extends Fragment {
?
?
? ?public FragmentMessage() {
? ? ? ?// Required empty public constructor
? }
?
?
? ?@Override
? ?public View onCreateView(LayoutInflater inflater, ViewGroup container,
? ? ? ? ? ? ? ? ? ? ? ? ? ? Bundle savedInstanceState) {
? ? ? ?// Inflate the layout for this fragment
? ? ? ?return inflater.inflate(R.layout.fragment_message, container, false);
? }
}
引用包部分没什么好说的,缺什么包引用什么即可。原本自动生成的java原本有很多的内容,但是我们这次的作业只用到了onCreateView和必须的构造器函数,onCreateView是创建Fragment时所必需调用的,构造器函数不用多说。onCreateView的inflater参数是一个压缩器,inflater.inflate(R.layout.fragment_message, container, false)表示将R.layout.fragment_message"压入"容器container,R.layout.fragment_message就是之前产生fragment类时生成的XML文件,false表示该过程失败时不做任何处理。 // ............ ? ?
// ............ ? ?
// ............ ? ?
private Fragment messageFragment = new FragmentMessage();
private Fragment contactFragment = new FragmentContact();
private Fragment exploreFragment = new FragmentExplore();
private Fragment meFragment = new FragmentMe();
private FragmentManager fragmentManager;
// ............
// ............ ? ?
// ............ ? ?
public void initFragmentManager(){
? ? ? ?// android而不是androidx
? ? ? ?fragmentManager = getFragmentManager();
? ? ? ?// transaction是事务管理方式
? ? ? ?FragmentTransaction transaction = fragmentManager.beginTransaction();
? ? ? ?transaction.add(R.id.id_content, messageFragment);
? ? ? ?transaction.add(R.id.id_content, contactFragment);
? ? ? ?transaction.add(R.id.id_content, exploreFragment);
? ? ? ?transaction.add(R.id.id_content, meFragment);
? ? ? ?transaction.commit(); ?// 添加要先提交
? ? ? ?hideFragmentAll(transaction);
? ? ? ?// 加载四个fragment之后默认显示第一个界面
? ? ? ?showFragmentOne(messageFragment);
? ? ? ?topText.setText(R.string.message);
? ? ? ?messageText.setTextColor(Color.GREEN);
? ? ? ?messageImage.setColorFilter(Color.GREEN);
?
}
public void hideFragmentAll(FragmentTransaction transaction){
? ? ? ?transaction.hide(messageFragment);
? ? ? ?transaction.hide(contactFragment);
? ? ? ?transaction.hide(exploreFragment);
? ? ? ?transaction.hide(meFragment);
}
?
public void showFragmentOne(Fragment oneFragment){
? ? ? ?FragmentTransaction transaction = fragmentManager.beginTransaction();
? ? ? ?hideFragmentAll(transaction);
? ? ? ?transaction.show(oneFragment);
? ? ? ?transaction.commit();
}
// ............
// ............ ? ?
// ............ ? ?
前面定义变量的部分不用多说,后面三个函数的功能分别是初始化fragment、隐藏fragment、显示fragment的作用。fragment是通过FragmentManager进行管理的,所以在initFragmentManager中,我们初始化了private FragmentManager fragmentManager,而FragmentTransaction则是一种事务管理方式,我们通过其实施具体的事务管理;transaction.add(R.id.id_content, messageFragment)则是将我们的fragment子类添加到activity_main.xml的FrameLayout中区,R.id.id_content就是通过id引用这个FrameLayout;transaction.show和transaction.hide的含义就很明显了,一个是展示某个Fragment,一个是隐藏某个Fragment;除这些之外,transaction.commit()也不可缺少,这是在transaction的一些操作结束后需要有的提交。 c.Java实现其他控制功能本次作业仅仅把Fragment”压缩“到FrameLayout上是不够的,我们还需要通过Java实现一定的控制功能,例如在点击底栏的消息、联系人等不同区域时要实现中间内容界面也就是fragment的切换和底部的颜色变化效果。要达到这样的效果,大致有两个部分,监听点击,监听到点击后进行相应的操作。 public class MainActivity extends AppCompatActivity implements View.OnClickListener {
// ................
// ................
// ................
@Override
? ?public void onClick(View view) {
? ?switch (view.getId()){
? ? ? ?case R.id.LinearLayoutMessage:
? ? ? ? ? ?showFragmentOne(messageFragment);
? ? ? ? ? ?topText.setText(R.string.message);
? ? ? ? ? ?setColorDefault();
? ? ? ? ? ?messageText.setTextColor(Color.GREEN);
? ? ? ? ? ?messageImage.setColorFilter(Color.GREEN);
? ? ? ? ? ?break;
? ? ? ?case R.id.LinearLayoutContact:
? ? ? ? ? ?showFragmentOne(contactFragment);
? ? ? ? ? ?topText.setText(R.string.contact);
? ? ? ? ? ?setColorDefault();
? ? ? ? ? ?contactText.setTextColor(Color.GREEN);
? ? ? ? ? ?contactImage.setColorFilter(Color.GREEN);
? ? ? ? ? ?break;
? ? ? ?case R.id.LinearLayoutExplore:
? ? ? ? ? ?showFragmentOne(exploreFragment);
? ? ? ? ? ?topText.setText(R.string.explore);
? ? ? ? ? ?setColorDefault();
? ? ? ? ? ?exploreText.setTextColor(Color.GREEN);
? ? ? ? ? ?exploreImage.setColorFilter(Color.GREEN);
? ? ? ? ? ?break;
? ? ? ?case R.id.LinearLayoutMe:
? ? ? ? ? ?showFragmentOne(meFragment);
? ? ? ? ? ?topText.setText(R.string.me);
? ? ? ? ? ?setColorDefault();
? ? ? ? ? ?meText.setTextColor(Color.GREEN);
? ? ? ? ? ?meImage.setColorFilter(Color.GREEN);
? ? ? ? ? ?break;
? ? ? ?default:
? ? ? ? ? ?break;
? }
? }
? ?public void setColorDefault(){
? ? ? ?messageImage.setColorFilter(0);
? ? ? ?messageText.setTextColor(Color.BLACK);
? ? ? ?contactImage.setColorFilter(0);
? ? ? ?contactText.setTextColor(Color.BLACK);
? ? ? ?exploreImage.setColorFilter(0);
? ? ? ?exploreText.setTextColor(Color.BLACK);
? ? ? ?meImage.setColorFilter(0);
? ? ? ?meText.setTextColor(Color.BLACK);
? }
?
}
这一次设置监听方式和以往不太一样,之前我们设置监听的方式都是针对单独的一个空间,例如: button.setOnClickListener(new View.OnClickListener() {
? ? ? ? ? ?@Override
? ? ? ? ? ?public void onClick(View view) {
? ? ? ? ? ? ? ?textView.setText(editText.getText());
? ? ? ? ? ? ? ?// imageView.setImageDrawable(getDrawable(R.drawable.p1));
? ? ? ? ? ? ? ?imageView.setImageResource(R.drawable.p1);
? ? ? ? ? }
? ? ? });
这里的button就是一个控件,我们对其设置了一个监听点击的函数,而这一次采用的则是另一种监听全局的方式,我们监听全局的点击,对于每次传入的点击进行检测,根据其ID确定是哪一个控件,然后进行相应的操作,需要注意的是这种方式需要继承接口View.OnClickListener。 至于实现点击切换的效果,则是比较简单的,对于fragment部分,先隐藏所有fragment,再显示点击的那一个即可。更改底栏控件的颜色也是与之类似,先将底栏所有控件的颜色设置为默认颜色,在将点击的那个控件设置为自己需要的颜色即可。 最终效果:
|
|
|
| 移动开发 最新文章 |
| Vue3装载axios和element-ui |
| android adb cmd |
| 【xcode】Xcode常用快捷键与技巧 |
| Android开发中的线程池使用 |
| Java 和 Android 的 Base64 |
| Android 测试文字编码格式 |
| 微信小程序支付 |
| 安卓权限记录 |
| 知乎之自动养号 |
| 【Android Jetpack】DataStore |
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年11日历 | -2025/11/28 21:42:28- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |