为您推荐:
精华内容
最热下载
问答
  • 5星
    2.4MB weixin_42128903 2021-01-14 19:07:28
  • 5星
    69.08MB weixin_43474701 2021-07-19 18:57:32
  • 5星
    11.64MB weixin_43474701 2021-07-16 11:57:17
  • 5星
    3.91MB lj_70596 2021-01-09 11:03:39
  • 5星
    10.8MB weixin_43474701 2021-07-15 22:08:48
  • 5星
    935.01MB weixin_43800734 2021-07-03 18:57:56
  • 5星
    23.97MB weixin_43474701 2021-07-15 20:57:15
  • 5星
    202KB qq_40757240 2021-01-24 22:39:21
  • 5星
    50.97MB qq_40957277 2021-06-11 23:18:59
  • 5星
    931.86MB weixin_43800734 2021-07-03 20:15:44
  • Android 入门基础教程(小白速成1) 编译工具:Android Studio 各种工具其实大同小异 开发环境的搭建还有项目新建这里就不过多说明了,网上有很多教程。项目新建按照需求来就好,我这里选用空的界面(Empty Activity...

    Android 入门基础教程(小白速成1)

    编译工具:Android Studio
    各种工具其实大同小异
    开发环境的搭建还有项目新建这里就不过多说明了,网上有很多教程。项目新建按照需求来就好,我这里选用空的界面(Empty Activity)和Android 4.0.3,大家一定要注意安卓版本匹配问题鸭,之前每次新建项目都报错,最后才发现是版本匹配问题。
    话不多说,进入正题吧!

    Hello World!

    新建好项目以后,我们首先认识几个主要用到的界面。
    在这里插入图片描述

    MainActivity.java页面,这个页面相当于我们的主视图。
    res文件夹是资源文件的配置文件。
    文件夹里面有 layout 用来存放布局文件。
    以上就是基本用到的文件,而如果此时项目没有报错,那么直接运行便会可以显示hello world,应用已经发布到了模拟器上。
    在这里插入图片描述
    如图,我们运行成功了。模拟器和普通手机很类似,可以实现很多功能。大家可以自行尝试。

    开始添加组件

    我们添加组件的操作是在activity_main.xml上通过拖动完成的
    在这里插入图片描述
    最左下角的design视图里,我们能通过拖动左边的组件,放在右边的界面上。Text页面是组件的代码,我们可以在text页面修改组件的参数。
    而拖动后可能会报错,如下图
    在这里插入图片描述
    只需要在右侧布局中点击组件周围的加号,给它固定位置即可
    在这里插入图片描述

    点击按钮响应

    我们可以向页面中拖入button,自然需要点击按钮时还有一定的响应。
    这就需要在activity_main.xml里的代码页面(Text)进行修改。

    <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="157dp"
            android:layout_marginLeft="157dp"
            android:layout_marginTop="218dp"
            android:text="Button"
    
            android:onClick="test"
    
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    

    我们只是添加了一句点击响应。点击时,调用test方法
    test方法是需要我们在 MainActivity.java 中自己定义的。

     public void test(View view){
            //View 表示把点击的对象引用传进来
            Toast.makeText(MainActivity.this,"点击了button",Toast.LENGTH_SHORT).show();
        }
    

    在类中添加如上方法,中间的参数分别表示绑定的对象,提示的信息和显示的时间长短。
    这样,我们就可以在点击按钮以后有一个小的提示出现。

    在这里插入图片描述

    点击修改组件信息

    如果要实现点击按钮后,对文字内容进行修改,我们首先需要找到文字内容的位置,类似于js中,我们可以在test方法中这样写。

     public void test(View view){
            //View 表示把点击的对象引用传进来
            TextView textView =findViewById(R.id.textView);
            textView.setText("内容被修改了");
            Toast.makeText(MainActivity.this,"点击了button",Toast.LENGTH_SHORT).show();
        }
    

    在这里插入图片描述
    (组件必须有id值才能被找到,所以记得看看要修改的组件id是什么,例如:android:id="@+id/textView")

    自定义string

    在values文件下我们可以看到有strings.xml,里面可以添加定义的字符串。

    <resources>
        <string name="app_name">My Application</string>
    
        <string name="st1">this is your word</string>>
    </resources>
    

    此时我们的test方法可以更改为这样,来使显示的文字变成我们提前定义好的st1。

    public void test(View view){
            //View 表示把点击的对象引用传进来
            TextView textView =findViewById(R.id.textView);
            textView.setText(R.string.st1);
            Toast.makeText(MainActivity.this,"点击了button",Toast.LENGTH_SHORT).show();
        }
    

    这么定义,主要是为了使这个字符串被多次引用时,调用、修改更为方便。

    当然,string不仅可以在代码中引用,也可以在页面中引用。

    android:text="@string/st1"
    

    这一句可以使按钮的显示文字变成我们定义的string

    资源国际化

    在res目录下新建文件夹:values-zh-rCN
    里面复制一份string.xml

    <resources>
        <string name="app_name">我的应用</string>
    
        <string name="st1">这里是自定义的文字</string>>
    </resources>
    
    

    虽然资源没有发生改变,但是实际运行却发现里面的文字变成了中文。
    而我们可以在模拟器的设置应用中找到语言切换(其实就是手机中切换显示语言的操作)。

    DDMS的应用

    DDMS是Dalvik调试监控服务,可以实现很多有用的功能:例如监控后台日志、系统线程、虚拟机状态、堆信息、模拟发短信、打电话……
    能够把模拟器运行的信息显示出来,方便我们调试程序。
    如果我们在test方法里,添加一句

    System.out.println("hhhhhhhhhhh")
    

    那么点击按钮后就能看到在后台
    在这里插入图片描述
    其实我们正常打印信息是选择使用log函数

     Log.d("init","Debug级别运行");
     Log.i("execute","info级别运行了");
    

    运行如下图所示
    在这里插入图片描述
    当然,那六个打印优先级是依次递减的,verbose所有都会显示,而assert所有的都不会显示。

    模拟器好玩的东西

    在这里插入图片描述
    右边的工具栏都是可以用的,而最底下那三个点,点击以后会进入Extended Control界面,在这里我们可以控制给自己发短信,打电话。
    在这里插入图片描述
    这个界面还有很多好玩的东西,就需要大家自己寻找啦!

    项目打包

    我们安装一个写好的程序是需要.apk文件的,我们可以点击build->build bundle(s)/apk(s)->bulid apk(s)
    生成,
    在这里插入图片描述
    然后就能在项目里找到apk文件。
    而这样产生的apk不够安全,有可能被同名的软件覆盖掉。
    所以我们就需要使用签名。

    apk设置签名

    为了安全起见
    我们一般要导出签名的应用

    1. build->generate signed bundle or apk
    2. 然后选择第二个:选择APK
    3. 创建一个新的密钥
    4. 配置密钥信息
    5. 选择release,勾选v2-apk签名
    6. 项目的release下便会有我们需要的apk文件
      在这里插入图片描述

    反编译小谈

    我们的apk文件实际上是一个压缩包,解压后可以看到我们项目经过处理后的文件。
    其中classes.dexresources.arsc文件是之前文件内容的集中和r类的集中。
    而反编译就是将这两个文件重新转化为之前文件的过程。

    反编译使用的软件:dex2jar和JD-GUI
    将需要反编译的文件拖进dex2jar的目录下,用cmd命令在目录下执行 dex2jar.bat 文件名(例如:dex2jar.bat classes.dex)
    然后会生成一个jar包

    用jd—gui.exe打开生成的jar包,我们就能看到可读的信息,也可以进行导出等操作。

    看到这里啦!制作不易,请点个赞再走吧!!!

    展开全文
    Embers_Young 2021-01-11 17:56:04
  • 1.b站链接:Android基础项目开发–饮食搭配app 2.学习资源打包:https://pan.baidu.com/s/1uqQW8mM5AiHUkwRxEzS7lQ 提取码: 54vs (侵删) 二、app功能展示及对应代码: 1.项目结构展示: 2.初始界面三个按钮 ...

    一、学习来源:

    1.b站链接:Android基础项目开发–饮食搭配app
    2.学习资源打包:https://pan.baidu.com/s/1uqQW8mM5AiHUkwRxEzS7lQ 提取码: 54vs
    (侵删)

    二、app功能展示及对应代码:

    1.项目结构展示:
    在这里插入图片描述
    在这里插入图片描述

    2.初始界面三个按钮
    在这里插入图片描述
    对应HomeMenuActivity代码:

    package com.animee.health;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    
    import com.animee.health.about.AboutActivity;
    import com.animee.health.food_grid.FoodGridActivity;
    import com.animee.health.food_list.InfoListActivity;
    //初始界面
    public class HomeMenuActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_home_menu);
        }
    
        public void onClick(View view) {//对按钮设置监听点击事件
            Intent intent = new Intent();
            switch (view.getId()){
                case R.id.home_btn1:
                    intent.setClass(HomeMenuActivity.this, InfoListActivity.class);
                    break;
                case R.id.home_btn2:
                    intent.setClass(HomeMenuActivity.this, FoodGridActivity.class);
                    break;
                case R.id.home_btn3:
                    intent.setClass(HomeMenuActivity.this, AboutActivity.class);
                    break;
            }
            startActivity(intent);
        }
    }
    

    对应的activity_home_menu布局文件:

    <?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:background="@mipmap/home_page"
        tools:context=".HomeMenuActivity"
        android:orientation="vertical"
        android:padding="20dp">
        <Button
            android:id="@+id/home_btn1"
            android:layout_width="match_parent"
            android:layout_height="70dp"
            android:background="@mipmap/btn_food_list"
            android:layout_marginTop="180dp"
            android:onClick="onClick"/>
        <Button
            android:id="@+id/home_btn2"
            android:layout_width="match_parent"
            android:layout_height="70dp"
            android:background="@mipmap/btn_food_nutriction"
            android:layout_marginTop="40dp"
            android:onClick="onClick"/>
        <Button
            android:id="@+id/home_btn3"
            android:layout_width="match_parent"
            android:layout_height="70dp"
            android:background="@mipmap/btn_food_about"
            android:layout_marginTop="40dp"
            android:onClick="onClick"/>
    </LinearLayout>
    

    3.食物搭配表界面:
    在这里插入图片描述
    对应的InfoListActivity:

    package com.animee.health.food_list;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.Toast;
    
    import com.animee.health.R;
    import com.animee.health.bean.FoodBean;
    import com.animee.health.bean.FoodUtils;
    import com.animee.health.food_grid.FoodDescActivity;
    
    import java.util.ArrayList;
    import java.util.List;
    //让整个Activity实现OnClickListener接口
    public class InfoListActivity extends AppCompatActivity implements View.OnClickListener {
        EditText searchEt;
        ImageView searchIv,flushIv;
        ListView showLv;
    
        //ListView内部数据源
        List<FoodBean> mDatas;
        List<FoodBean> allFoodList;
        private InfoListAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_info_list);
    
            //1.查找控件
            initView();
            //2.找到ListView对应的数据源
            mDatas = new ArrayList<>();
            allFoodList = FoodUtils.getAllFooList();
            mDatas.addAll(allFoodList);
            //3.创建适配器 BaseAdapter的子类
            adapter = new InfoListAdapter(this,mDatas);
            //4.设置适配器
            showLv.setAdapter(adapter);
            //设置单项点击监听事件
            setListener();
        }
    
        private void setListener() {
            showLv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    FoodBean foodBean = mDatas.get(position);
                    Intent intent = new Intent(InfoListActivity.this, FoodDescActivity.class);
                    intent.putExtra("food",foodBean);
                    startActivity(intent);
                }
            });
        }
    
        private void initView() {
            searchEt = findViewById(R.id.info_et_search);
            searchIv = findViewById(R.id.info_iv_search);
            flushIv = findViewById(R.id.info_iv_flush);
            showLv = findViewById(R.id.infolist_lv);
            searchIv.setOnClickListener(this);//添加搜索点击事件监听
            flushIv.setOnClickListener(this);//添加刷新点击事件监听
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.info_iv_flush://刷新点击
                    searchEt.setText("   ");
                    mDatas.clear();
                    mDatas.addAll(allFoodList);
                    adapter.notifyDataSetChanged();
                    break;
                case R.id.info_iv_search://搜索点击
                    //1.获取输入内容,判断不为空
                        String msg = searchEt.getText().toString().trim();//获取输入信息
                    if (TextUtils.isEmpty(msg)) {//是空则不搜索
                        Toast.makeText(this,"输入内容不能为空",Toast.LENGTH_SHORT).show();
                        return;
                    }
                    //2.判断所有食物列表的标题是否包含输入内容,如果包含,就添加到小集合中
                    List<FoodBean> list = new ArrayList<>();
                    for (int i = 0; i < allFoodList.size() ; i++) {
                        String title = allFoodList.get(i).getTitle();
                        if (title.contains(msg)) {
                            list.add(allFoodList.get(i));
                        }
                    }
                    mDatas.clear();//清空listview的适配器数据源内容
                    mDatas.addAll(list);//添加新的数据源
                    adapter.notifyDataSetChanged();//提示适配器更新
                    break;
            }
        }
    }
    
    

    对应的activity_info_list布局文件:

    <?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=".food_list.InfoListActivity">
    <!--    最上面搜索栏-->
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:padding="10dp"
            android:background="@mipmap/search_background">
            <ImageView
                android:id="@+id/info_iv_flush"
                android:src="@mipmap/clear_btn"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <ImageView
                android:id="@+id/info_iv_search"
                android:src="@mipmap/search_btn"
                android:layout_toLeftOf="@id/info_iv_flush"
                android:layout_centerVertical="true"
                android:layout_marginRight="20dp"
                android:layout_marginLeft="20dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <EditText
                android:id="@+id/info_et_search"
                android:layout_toLeftOf="@id/info_iv_search"
                android:paddingLeft="20dp"
                android:textColor="@color/white"
                android:background="@drawable/info_et_bg"
                android:layout_centerVertical="true"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
        </RelativeLayout>
    <!--内容显示-->
        <ListView
            android:id="@+id/infolist_lv"
            android:divider="@color/dividerColor"
            android:dividerHeight="1dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </ListView>
    </LinearLayout>
    

    ListView对应的InfoListAdapter适配器:

    package com.animee.health.food_list;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import com.animee.health.R;
    import com.animee.health.bean.FoodBean;
    
    import java.util.List;
    
    public class InfoListAdapter extends BaseAdapter {
        Context context;
        List<FoodBean> mDatas;
    
        public InfoListAdapter(Context context, List<FoodBean> mDatas) {
            this.context = context;
            this.mDatas = mDatas;
        }
    //决定了ListView列表展示的行数
        @Override
        public int getCount() {
            return mDatas.size();
        }
    //返回指定位置对应的数据
        @Override
        public Object getItem(int position) {
            return mDatas.get(position);
        }
    //返回指定位置所对应的id
        @Override
        public long getItemId(int position) {
            return position;
        }
    //返回指定位置所对应的view
    //将已经滑动出去的列表项复用优化
        @Override
        public View getView(int i, View convertView, ViewGroup viewGroup) {
            //对包含了控件的类进行声明
            ViewHolder holder = null;
            if (convertView == null){//第一次创建,没有复用的
                //将布局转化为view对象
                convertView = LayoutInflater.from(context).inflate(R.layout.item_infolist_lv,null);
                //初始化holder
                holder = new ViewHolder(convertView);
                convertView.setTag(holder);
            }else{//如果内存已经有滑动出去的ListView
                holder = (ViewHolder)convertView.getTag();
            }
            //加载控件当中的显示
            //获取集合指定位置的数据
            FoodBean foodBean = mDatas.get(i);
            holder.titleTv.setText(foodBean.getTitle());
            holder.notTv.setText("不可匹配:"+foodBean.getNotmatch());
            holder.iv.setImageResource(foodBean.getPicId());
            return convertView;
        }
        //view所有的类进行封装
        class ViewHolder{
            ImageView iv;
            TextView titleTv,notTv;
            public ViewHolder(View view){
                iv = view.findViewById(R.id.item_info_iv);
                titleTv = view.findViewById(R.id.item_info_tv_title);
                notTv = view.findViewById(R.id.item_info_tv_notmatch);
            }
        }
    }
    
    

    另外:在食物搭配表界面,点击listview选项后会呈现该食物的详细信息,例如,点击猪肉:
    在这里插入图片描述
    对应的FoodDescActivity:

    package com.animee.health.food_grid;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import com.animee.health.R;
    import com.animee.health.bean.FoodBean;
    
    public class FoodDescActivity extends AppCompatActivity {
        TextView titleTv1,titleTv2,descTv,notTv;
        ImageView backIv,bigPicIv;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_food_desc);
            initView();
            //接收上一级页面传来的数据
            Intent intent = getIntent();
            FoodBean foodBean = (FoodBean) intent.getSerializableExtra("food");
            //设置显示控件
            titleTv1.setText(foodBean.getTitle());
            titleTv2.setText(foodBean.getTitle());
            descTv.setText(foodBean.getDesc());
            notTv.setText(foodBean.getNotmatch());
            bigPicIv.setImageResource(foodBean.getPicId());
        }
    
        private void initView() {
            titleTv1 = findViewById(R.id.fooddesc_tv_title);
            titleTv2 = findViewById(R.id.fooddesc_tv_title2);
            descTv = findViewById(R.id.fooddesc_tv_desc);
            notTv = findViewById(R.id.food_tv_not);
            backIv = findViewById(R.id.fooddesc_iv_back);
            bigPicIv = findViewById(R.id.fooddesc_iv_bigpic);
    
            backIv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    finish();//销毁当前的activity
                }
            });
        }
    }
    

    对应的activity_food_desc布局文件:

    package com.animee.health.food_grid;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import com.animee.health.R;
    import com.animee.health.bean.FoodBean;
    
    public class FoodDescActivity extends AppCompatActivity {
        TextView titleTv1,titleTv2,descTv,notTv;
        ImageView backIv,bigPicIv;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_food_desc);
            initView();
            //接收上一级页面传来的数据
            Intent intent = getIntent();
            FoodBean foodBean = (FoodBean) intent.getSerializableExtra("food");
            //设置显示控件
            titleTv1.setText(foodBean.getTitle());
            titleTv2.setText(foodBean.getTitle());
            descTv.setText(foodBean.getDesc());
            notTv.setText(foodBean.getNotmatch());
            bigPicIv.setImageResource(foodBean.getPicId());
        }
    
        private void initView() {
            titleTv1 = findViewById(R.id.fooddesc_tv_title);
            titleTv2 = findViewById(R.id.fooddesc_tv_title2);
            descTv = findViewById(R.id.fooddesc_tv_desc);
            notTv = findViewById(R.id.food_tv_not);
            backIv = findViewById(R.id.fooddesc_iv_back);
            bigPicIv = findViewById(R.id.fooddesc_iv_bigpic);
    
            backIv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    finish();//销毁当前的activity
                }
            });
        }
    }
    

    对应的每种食物FoodBean类:

    package com.animee.health.bean;
    
    import java.io.Serializable;
    
    public class FoodBean implements Serializable {
        //Serializable接口是启用其序列化功能的接口。
        //实现java.io.Serializable 接口的类是可序列化的。
        // 没有实现此接口的类将不能使它们的任意状态被序列化或逆序列化。
        private String title;
        private String notmatch;
        private String desc;
        private int picId;
    
        public FoodBean(String title, String notmatch, String desc, int picId) {
            this.title = title;
            this.notmatch = notmatch;
            this.desc = desc;
            this.picId = picId;
        }
        public FoodBean(){
    
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getNotmatch() {
            return notmatch;
        }
    
        public void setNotmatch(String notmatch) {
            this.notmatch = notmatch;
        }
    
        public String getDesc() {
            return desc;
        }
    
        public void setDesc(String desc) {
            this.desc = desc;
        }
    
        public int getPicId() {
            return picId;
        }
    
        public void setPicId(int picId) {
            this.picId = picId;
        }
    }
    
    

    初始化食物对应信息的FoodUtils类:

    package com.animee.health.bean;
    
    import com.animee.health.R;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class FoodUtils {
        private static final String[] food = { "猪肉", "猪肝", "猪血", "羊肉", "牛肉", "牛肝", "鹅肉", "兔肉", "狗肉",
                "鸭肉", "鸡肉", "驴肉", "鸡蛋", "鲤鱼", "黄鱼", "虾", "虾皮", "螃蟹", "蛤", "鳖肉",
                "田螺", "大蒜", "葱", "萝卜", "芹菜", "韭菜", "菠菜", "莴笋", "竹笋", "西红柿", "洋葱",
                "醋", "茶", "豆浆", "红糖", "蜂蜜", "牛奶", "白酒", "啤酒" };
        private static final String[] food1 = { "黄莲", "荞麦 雀肉 豆芽", "何首乌 地黄 黄豆 海带", "醋 红豆 半夏 南瓜",
                "橄榄 板粟 韭菜 ", "鲇鱼 鳗鱼 柿子", "狗肉 鲤鱼 柑橘", "鲤鱼 绿豆", "鳖", "鲤鱼", "金针菇",
                "豆浆 兔肉", "甘草 麦冬", "荞麦面 ", "富含维生素C的食物", "红枣 黄豆",
                "梨 柿子 茄子 花生仁 石榴 香瓜 芹菜 蜂蜜 西红柿", "芹菜 ", "鸭肉", "香瓜 木耳 牛肉 蚕豆 玉米",
                "地黄 何首乌 白术", "枣", "橘子 木耳", "黄瓜 蚬、蛤、蟹", "牛肉", "豆腐 鳝鱼 黄瓜", "蜂蜜",
                "糖浆", "白酒", "蜂蜜", "胡萝卜", "酒", "蜂蜜", "竹笋", "皮蛋", "豆腐 韭菜",
                "钙片果汁  药物 韭菜 柠檬", "胡萝卜 核桃 啤酒 红薯", "海鲜" };
        private static final int[] resId = { R.mipmap.pork, R.mipmap.pigliver, R.mipmap.pigblood,
                R.mipmap.lamb, R.mipmap.beef, R.mipmap.beefliver,
                R.mipmap.goose, R.mipmap.rabbit, R.mipmap.dog,
                R.mipmap.duck, R.mipmap.chicken, R.mipmap.donkey,
                R.mipmap.egg, R.mipmap.carp, R.mipmap.yellowfish,
                R.mipmap.shrimp, R.mipmap.shrimp2, R.mipmap.crab,
                R.mipmap.clam, R.mipmap.turtle, R.mipmap.riversnail,
                R.mipmap.garlic, R.mipmap.onion, R.mipmap.radish,
                R.mipmap.celery, R.mipmap.leek, R.mipmap.spinach,
                R.mipmap.lettuce, R.mipmap.bamboo, R.mipmap.tomato,
                R.mipmap.foreignonion, R.mipmap.vinegar, R.mipmap.tea,
                R.mipmap.beanmilk, R.mipmap.brownsuger, R.mipmap.honey,
                R.mipmap.milk, R.mipmap.whitespirit, R.mipmap.beer };
        private static final String [] foodjianjie={"猪肉是目前人们餐桌上最常见的肉类食物之一,猪瘦肉中富含铁,容易被人体吸收,能预防贫血。猪肉味甘咸,性平,有补虚、滋阴、养血、润燥的功效。"
                ,"猪肝味甘、苦,性温,归肝经。猪肝富含多种营养素,是预防缺血性贫血的首选食品,猪肝中的铁容易被人体吸收,是理想的补肝、明目、养血的食品。"
                ,"猪血味甘、苦,性温,有解毒清肠、补血美容的功效。猪血富含维生素B2、维生素C、蛋白质、铁、磷、钙、尼克酸等营养成分。",
                "羊肉味甘、性温,具有补虚劳,祛寒冷,温补气血;益肾气,补形衰,开胃健力的功效。用于气血不足、腹部冷痛、体虚怕冷、腰膝酸痛、面黄肌瘦、血气两亏等一切虚状均有补益效果,最适宜冬季食用。",
                "牛肉有补中益气,滋养脾胃,强健筋骨,化痰息风,止渴止涎之功效。牛肉富含蛋白质,而脂肪少,氨基酸组成比猪肉更接近人体需要,能提高机体抗病能力。",
                "养血,补肝,明目。牛肝中铁质丰富,是补血食品中最常用的食物。"
                ,"鹅肉含有人体生长发育所必需的各种氨基酸,其组成接近人体所需氨基酸的比例,从生物学价值上来看,鹅肉是是理想的高蛋白、低脂肪、低胆固醇的营养健康食品,其亚麻酸含量超过其它肉类。鹅肉性平、味甘,具有益气补虚,和胃止渴的功效。",
                "兔肉质地细嫩,味道鲜美,营养丰富,与猪牛、羊肉相比较,兔肉营养成分独特,具有高铁、高钙、高磷脂和低脂肪、低胆固醇等特点,并且具有很高的消化率(可达85%),食后极易被消化吸收。",
                "狗肉温补脾胃、补肾助阳、壮力气、补血脉。狗肉不仅蛋白质含量高,而且蛋白质质量极佳,尤以球蛋白比例大,对增强机体抗病力和细胞活力及器官功能有明显作用。",
                "富含蛋白质、脂肪、铁、钾、糖等多种营养成分。其饱和脂肪酸的含量比猪肉、牛肉、羊肉少得多,脂肪酸熔点低,易于消化。所含胆固醇比鱼还要低一些。《本草纲目》记载:鸭肉主大补虚劳,最消毒热,利小便,除水肿,消胀满,利脏腑,退疮肿,定惊痫。",
                "鸡肉含丰富蛋白质,种类多,其含量比猪、牛、羊肉都高,而脂肪含量比其它肉类低,且多为不饱和脂肪酸,营养价值高,消化率高,很容易被人体吸收利用,有增强体力、强壮身体的作用。",
                "驴肉富含蛋白质,而且含有动物胶、骨胶原、钙、硫等成分,其中含有的高级不饱和脂肪酸,尤其是亚油酸、亚麻酸,对动脉硬化、冠心病、高血压有着良好的保健作用。中医认为:驴肉性味甘凉,有补气养血、滋阴壮阳、安神去烦功效。",
                "鸡蛋被认为是营养丰富的食品,含有蛋白质、脂肪、卵黄素、卵磷脂、维生素和铁、钙、钾等人体所需要的矿物质。鸡蛋味甘、性平,具有养心安神、补血、滋阴润燥的功效。",
                "鲤鱼的蛋白质不但含量高,而且质量也佳,人体消化吸收率可达96%,并能供给人体必需的氨基酸、矿物质、维生素A和维生素D。鲤鱼味甘、性平,具有健脾开胃、消水肿、利小便的作用。",
                "黄鱼含有丰富的蛋白质、微量元素和维生素,对人体有很好的补益作用。中医认为,黄鱼有和胃止血、益肾补虚、健脾开胃、安神止痢、益气填精之功效,对贫血、失眠、头晕、食欲不振及妇女产后体虚有良好疗效。",
                "虾营养极为丰富,含蛋白质是鱼、蛋、奶的几倍到几十倍;还含有丰富的钾、碘、镁、磷等矿物质及维生素A、氨茶碱等成分。",
                "虾皮中含有丰富的蛋白质和矿物质,尤其是钙的含量极为丰富,是缺钙者补钙的较佳途径之一。",
                "螃蟹含有丰富的蛋白质及钙、磷、铁等微量元素,对身体有很好的滋补作用。中医学认为螃蟹性寒、味咸,有清热、散血结、续断伤、理经脉和滋阴等功用;其壳可清热解毒、破淤清积止痛。",
                "肉味鲜美、营养丰富,蛋白质含量高,氨基酸的种类组成及配比合理; 脂肪含量低,不饱和脂肪酸较高,易被人体消化吸收。蛤味咸、性寒,有滋阴、利水、化痰、软坚的功效。",
                "鳖肉偏于滋阴补肾、补虚。是久病体弱,消瘦无力等人群的食疗佳品。鳖味咸、性平,具有滋阴凉血、平肝益气、散结软坚、消淤等功效。",
                "含蛋白质、脂肪、碳水化合物、钙、磷、铁、硫胺素、核黄素、尼克酸、维生素。田螺味咸、性寒,有清热利水、除湿解读的功效。",
                "大蒜含有丰富的营养成分,尤其是具有独特生物活性的蒜素等含硫化合物及硒蛋白等功能成分,这些物质具有显著的医用和食用价值。中医理论认为,大蒜生者辛热、熟者甘温,可除寒湿、怯阴邪、下气暖中、消谷化积、破恶血、攻冷积。",
                "葱的主要营养成分是蛋白质、糖类、维生素A原(主要在绿色葱叶中含有)、食物纤维以及磷、铁、镁等矿物质等。中医记载:葱能发汗解表,散寒通阳,解毒散凝。主治风寒感冒轻症,痈肿疮毒,痢疾脉微,寒凝腹痛,小便不利等病症。",
                "萝卜含有丰富的碳水化合物、纤维素、维生素C及钙、磷、钾、铁等矿物质,营养丰富;萝卜还有促进新陈代谢,增进食欲的作用,对于治疗消化不良、胃脘胀满、咳嗽多痰、胸闷气喘、伤风感冒有一定的疗效。",
                "芹菜含有蛋白质、脂肪、碳水化合物、纤维素、维生素、矿物质等营养成分。其中,维生素B、P的含量较多。矿物质元素钙、磷、铁的含量更是高于一般绿色蔬菜。",
                "韭菜性温,味辛,具有补肾起阳作用,且含有大量维生素和粗纤维,能增进胃肠蠕动,治疗便秘。",
                "菠菜含水量高(90%~93%),而热量低,是镁、铁、钾和维生素A的优质来源;也是钙和维生素C的上等来源。所含的磷、锌、叶酸和维生素B6也较为丰富。菠菜中含有的维生素C能够提高铁的吸收率,并促进铁与造血的叶酸共同作用,有效地预防贫血症。",
                "莴苣含蛋白质、脂粉、碳水化合物、钙、磷、铁、胡萝卜素、及维生素B、维生素C、尤其含烟酸较多。莴苣味道清新且略带苦味,可刺激消化酶分泌,增进食欲。其乳状浆液,可增强胃液、消化腺的分泌和胆汁的分泌,从而促进消化。",
                "具有滋阴凉血、和中润肠、清热化痰、解渴除烦、清热益气、利隔爽胃、利尿通便、解毒透疹、养肝明目、消食的功效,还可开胃健脾,宽肠利膈,通肠排便,开膈豁痰,消油腻,解酒毒。",
                "番茄富含维生素C,其含有的番茄红素有利尿和抑制细菌生长的作用,是优良的抗氧化剂,多吃番茄具有抗衰老作用,使皮肤保持白皙。西红柿味酸微甘、性平,具有生津止渴,健胃消食,凉血平肝,清热解毒,降低血压之功效。",
                "洋葱所含的微量元素硒是一种很强的抗氧化剂,能清除体内的自由基,增强细胞的活力和代谢能力,具有抗衰老的功效。",
                "醋可以开胃,促进唾液和胃液的分泌,帮助消化吸收,使食欲旺盛,消食化积。醋还有很好的抑菌和杀菌作用,能有效预防肠道疾病、流行性感冒和呼吸疾病。",
                "茶叶内含化合物500种左右,有些是人体必需的营养成分。如维生素类、蛋白质、氨基酸、类脂类、糖类及矿物质元素等,对人体有较高营养价值。有些是对人体有保健和药用价值的成分,如茶多酚、咖啡碱、脂多糖等,常喝茶有利于人体健康。",
                "豆浆含有丰富的植物蛋白,磷脂,维生素B1、B2,烟酸和铁、钙等矿物质,尤其是钙的含量,虽不及豆腐高,但比其他任何乳类都丰富。豆浆是防治高血脂、高血压、动脉硬化等疾病的理想食品。",
                "红糖中所含有的葡萄糖、果糖等多种单糖和多糖类能量物质,为人体提供能量。",
                "蜂蜜含有70%以上的转化糖,能够被人体肠壁细胞直接吸收利用,没有必要经人体消化,经常服用蜂蜜,能帮助消化。",
                "牛奶的营养成分很高,牛奶中的矿物质种类也非常丰富,除了我们所熟知的钙以外,磷、铁、锌、铜、锰、钼的含量都很多。牛奶是人体钙的最佳来源,而且钙磷比例非常适当,利于钙的吸收。牛奶中含组成人体蛋白质的氨基酸有20种,其中有8种是人体本身不能合成的,为必需氨基酸,牛奶是人类最理想的天然食品。",
                "白酒主要由水乙醇和少量微量元素组成。夜晚服用少量的白酒,可平缓的促进血液循环,起到催眠作用。饮少量白酒可刺激胃液分泌与唾液分泌,因而起到健胃和止疼痛、利小便及驱虫的作用。白酒味苦、甘、辛,性温,有毒,入心、肝、肺、胃经。",
                "啤酒营养丰富,其中含有丰富的氨基酸,是原料大麦含有的蛋白质经过酶的作用分解而产生的。且啤酒中还含有多种维生素。适量饮啤酒有强心、利尿、健胃的功效。"};
    
    
        //数据源生成
        public static List<FoodBean> getAllFooList(){
            List<FoodBean> list = new ArrayList<>();
            for (int i = 0; i < food.length; i++) {
                FoodBean bean = new FoodBean(food[i],food1[i],foodjianjie[i],resId[i]);
                list.add(bean);
            }
            return list;
        }
    }
    
    

    4.食物营养表界面:
    在这里插入图片描述
    对应的FoodGridActivity:

    package com.animee.health.food_grid;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.GridView;
    
    import com.animee.health.R;
    import com.animee.health.bean.FoodBean;
    import com.animee.health.bean.FoodUtils;
    import com.animee.health.food_list.InfoListActivity;
    
    import java.util.List;
    
    public class FoodGridActivity extends AppCompatActivity {
        GridView gv;
        List<FoodBean> mDatas;
        private FoodGridAdapter adapter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_food_grid);
            gv = findViewById(R.id.food_grid_gv);
            //找数据源
            mDatas = FoodUtils.getAllFooList();
            //创建适配器对象
            adapter = new FoodGridAdapter(this,mDatas);
            //设置适配器
            gv.setAdapter(adapter);
            //设置单项点击监听事件
            setListener();
        }
        private void setListener() {
            gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    FoodBean foodBean = mDatas.get(position);
                    Intent intent = new Intent(FoodGridActivity.this, FoodDescActivity.class);
                    intent.putExtra("food",foodBean);
                    startActivity(intent);
                }
            });
        }
    }
    

    对应的activity_food_grid布局文件:

    <?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=".food_grid.FoodGridActivity">
        <RelativeLayout
            android:id="@+id/food_grid_layout"
            android:background="@mipmap/search_background"
            android:layout_width="match_parent"
            android:layout_height="60dp">
            <TextView
                android:layout_centerInParent="true"
                android:text="健康饮食"
                android:textSize="20dp"
                android:textStyle="bold"
                android:textColor="@color/white"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        </RelativeLayout>
    <!--网格视图控件-->
        <GridView
            android:id="@+id/food_grid_gv"
            android:numColumns="2"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </GridView>
    </LinearLayout>
    

    注意:点击食物营养表的listview选项,和食物搭配表点击效果一样,会呈现该食物的详细信息

    5.关于本软件界面:
    在这里插入图片描述
    对应的AboutActivity文件:

    package com.animee.health.about;
    
    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.viewpager.widget.ViewPager;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    import com.animee.health.R;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class AboutActivity extends AppCompatActivity implements View.OnClickListener {
        ViewPager aboutVp;
        TextView shareTv;
        LinearLayout pointLayout;
        List<View> viewList;//ViewPager的数据源
        int[] picIds = {R.mipmap.ab1,R.mipmap.ab2,R.mipmap.ab3,R.mipmap.ab4,R.mipmap.ab5};//图片存放数组
        private AboutAdapter adapter;
        List<ImageView> pointList;//存放显示器小点点的集合
    
        //定时切换页面,实现自动播放,
        Handler handler = new Handler(){
            @Override
            public void handleMessage(@NonNull Message msg) {
                if (msg.what == 1) {
                    //接收到消息之后,要使viewPager页面向下滑动一页
                    int currentItem = aboutVp.getCurrentItem();
                    aboutVp.setCurrentItem(currentItem+1);
                    handler.sendEmptyMessageDelayed(1,4000);
                }
            }
        };
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_about);
            aboutVp = findViewById(R.id.about_vp);
            shareTv = findViewById(R.id.about_tv_share);
            pointLayout = findViewById(R.id.about_layout_point);
            shareTv.setOnClickListener(this);
            viewList = new ArrayList<>();
            pointList = new ArrayList<>();
    
            //初始化ViewPager的页面信息
            for (int i = 0; i < picIds.length; i++) {
                View view = LayoutInflater.from(this).inflate(R.layout.item_aboutvp,null);
                ImageView iv = view.findViewById(R.id.item_aboutvp_iv);
                //显示内容
                iv.setImageResource(picIds[i]);
                //放进集合当中
                viewList.add(view);
    
                //创建指示器内容
                ImageView pointIv = new ImageView(this);
                //在代码中设置控件的宽高和外边距等属性
                LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                        LinearLayout.LayoutParams.WRAP_CONTENT);
                lp.setMargins(0,0,20,0);
                //将布局参数设置给ImageView
                pointIv.setLayoutParams(lp);
                pointIv.setImageResource(R.mipmap.a2);
                pointList.add(pointIv);//添加到集合当中便于统一管理
                pointLayout.addView(pointIv);//添加到布局当中显示出来
            }
            pointList.get(0).setImageResource(R.mipmap.a3);//设置第一个小圆点为选中状态
    
            //创建适配器对象
            adapter = new AboutAdapter(viewList);
            //设置适配器
            aboutVp.setAdapter(adapter);
            //发送切换页面消息,自己发送消息自己接收
            handler.sendEmptyMessageDelayed(1,4000);
            //设置viewPager页面监听器
            setVPListener();
        }
    
        private void setVPListener() {
            //设置viewPager页面监听器
            aboutVp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    
                //页面发生滚动时,自动调用的方法,一般不用
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                }
    
                //表示正被选中的
                @Override
                public void onPageSelected(int position) {
                    for (int i = 0; i < pointList.size(); i++) {
                        pointList.get(i).setImageResource(R.mipmap.a2);//所有的改成白色
                    }
                    //选中的改成红色
                    pointList.get(position%pointList.size()).setImageResource(R.mipmap.a3);
                }
    
                //表示滚动的状态
                @Override
                public void onPageScrollStateChanged(int state) {
                }
            });
        }
    
        @Override
        //分享按钮的监听事件
        public void onClick(View view) {
            //调用系统自带的分享功能,固定格式
            //隐式Intent
            Intent intent = new Intent(Intent.ACTION_SEND);
            intent.setType("text/plain");
            String msg = "健康饮食非常重要,了解饮食让你变得更健康,快来下载健康饮食app";
            intent.putExtra(Intent.EXTRA_TEXT,msg);
            startActivity(Intent.createChooser(intent,"健康饮食分享"));
         }
    }
    

    对应的activity_about布局文件:

    <?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:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".about.AboutActivity">
    <!--实现视图滑动切换工具ViewPager-->
        <androidx.viewpager.widget.ViewPager
            android:id="@+id/about_vp"
            android:layout_width="match_parent"
            android:layout_height="230dp">
        </androidx.viewpager.widget.ViewPager>
    <!--存放小点点-->
        <LinearLayout
            android:id="@+id/about_layout_point"
            android:orientation="horizontal"
            android:gravity="center"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </LinearLayout>
    <!--版本-->
        <TextView
            android:id="@+id/about_version"
            android:text="当前版本:1.0"
            android:drawableLeft="@mipmap/icon_door"
            android:gravity="center_vertical"
            android:textSize="18sp"
            android:textStyle="bold"
            android:drawablePadding="20dp"
            android:padding="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
        <TextView
            android:background="#000000"
            android:layout_width="match_parent"
            android:layout_height="1dp"/>
    <!--联系方式-->
        <TextView
            android:id="@+id/about_tv_tel"
            android:text="联系电话:13803837332"
            android:drawableLeft="@mipmap/icon_phone"
            android:gravity="center_vertical"
            android:textSize="18sp"
            android:textStyle="bold"
            android:drawablePadding="20dp"
            android:layout_marginTop="10dp"
            android:padding="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
        <TextView
            android:background="#000000"
            android:layout_width="match_parent"
            android:layout_height="1dp"/>
    <!--地址-->
        <TextView
            android:id="@+id/about_tv_address"
            android:text="公司地址:郑州大学新校区"
            android:drawableLeft="@mipmap/icon_world"
            android:gravity="center_vertical"
            android:textSize="18sp"
            android:textStyle="bold"
            android:drawablePadding="20dp"
            android:layout_marginTop="10dp"
            android:padding="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
        <TextView
            android:background="#000000"
            android:layout_width="match_parent"
            android:layout_height="1dp"/>
    <!--分享软件-->
        <TextView
            android:id="@+id/about_tv_share"
            android:text="分享软件"
            android:drawableLeft="@mipmap/icon_flash"
            android:gravity="center_vertical"
            android:textSize="18sp"
            android:textStyle="bold"
            android:drawablePadding="20dp"
            android:layout_marginTop="10dp"
            android:padding="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </LinearLayout>
    
    展开全文
    weixin_44722009 2021-01-28 17:27:42
  • 为方便朋友入门安卓应用开发,整理的 Android 新手教程 2021 版。突出一个简单明了,上手快。从实用性出发,快速掌握 Android 开发基本技能。 《Android编程入门教程》分为 Java语言基础从入门到熟悉、Kotlin语言...

    前言

    Android 系统是目前世界上市场占有率最高的移动操作系统,而 Android 系统近两年经历了很多新版本的发布,特别是一些新兴热门框架技术的引用。为方便朋友入门安卓应用开发,整理的 Android 新手教程 2021 版。突出一个简单明了,上手快。从实用性出发,快速掌握 Android 开发基本技能。

    《Android编程入门教程》分为 Java语言基础从入门到熟悉、Kotlin语言基础从入门到熟悉、Android 技术栈从入门到熟悉、Android Jetpack 全家桶全面学习 四个部分,共70个小章节,776页。

    Java语言基础从入门到熟悉

    一. Java综述
    • 面向对象
    • 设计模式
    二. Java基础
    • 基础笔记
    • 接口与抽象类

    三. class
    • Java 类的基础,class 基础
    • Java 类初始化顺序
    • 接口与抽象类
    • Java equals 方法与 == 的区别

    四. 面向对象
    • 抽象,封装,继承,多态
    • 多态
    五. 容器
    • Java集合类
    • ArrayList介绍
    • Map

    六. 多线程
    • 线程简介
    • Java 读写锁

    七. IO
    • Java读写文件
    • Java读写xls文件

    八. 正则表达式
    • 使用正则表达式
    • 查找特定字符串
    • 提取特定字符
    • 例子1:从非字母中间提取出字母。
    • 例子2:从非字母中间找到英文单词。

    九. 日历
    • 按日计算年龄
    十. 注解使用与简单说明
    • 使用注解
    十一. Java使用加密算法
    • MD5

    Kotlin语言基础从入门到熟悉

    一. Kotlin系列简介
    • 系列大纲
    二. 新建项目
    • Hello World
    • 变量

    三. 概念介绍
    • 包的定义和使用
    • 程序入口
    • 标准输出
    • 方法
    • 变量
    • 创建类与实例
    • 注释
    • 字符串模版(String tempplates)
    • 条件表达式
    • for循环
    • while循环
    • when表达式
    • 范围
    • 集合
    • 可为null的值和null检查
    • 类型检查和自动转换

    四. 常用写法
    • 方法参数的默认值
    • 过滤列表
    • 检查某个元素是否在集合里
    • String插值
    • 只可读的列表
    • 只可读的 map
    • while 循环读写流
    五. lambda
    • 什么是 Lambda 表达式
    • 简化 Lambda 表达式
    • 从 Lambda 中返回
    • Lambda 表达式的类型
    • SAM 转换

    六. 高阶函数
    • 高阶函数介绍
    • Kotlin常用标准高阶函数介绍
    • 自定义高阶函数

    七. 扩展函数
    • 何为扩展函数
    • 扩展函数的解析为静态的
    • 扩展函数不支持多态
    • 扩展函数的作用域

    八. 协程

    Kotlin协程入门
    Kotlin协程基础
    Kotlin协程取消与超时

    Android 技术栈从入门到熟悉

    一. 开始
    • 新建App工程
    • Android项目使用kotlin

    二,Activity
    • Android Activity综述
    • Activity 生命周期
    • Activity 启动,携带参数启动
    • Activity 传递Parcelable对象
    • Activity 返回时携带参数
    • Activity 启动模式,任务和返回栈
    • Activity 过场动画效果
    • Activity 中获取 View 的宽高

    三. Service 服务
    • Service 综述
    • 后台服务
    • 启动前台服务
    • IntentService 分析和用法

    四. Broadcast 广播机制
    • 广播机制 Broadcast 介绍与使用
    • Android 监听屏幕亮灭

    五. Fragment
    • Fragment 基础概念
    • Fragment 加载方法
    • Fragment 间的通信
    • DialogFragment

    六. res应用资源
    • res资源目录简介
    • shape的绘制和使用
    • Android Button,TextView背景增添动感
    • Android使用第三方字体
    • 使用shape来绘制虚线
    • 适配

    七. 权限
    • Android 添加自定义权限
    八. TextView 显示文字
    • TextView简介
    • textStyle
    • Android 字体(字库)
    • 特殊字符
    • SpannableString

    九. EditText 用户输入
    • EditText 监听回车
    • EditText 光标移动与选择
    • 监听输入内容
    • PopupWindow 中 EditText 无法编辑,无法弹出软键盘
    • EditText 弹出软键盘遮住输入框问题

    十. Button 按钮
    十一. ImageView 图片显示
    • 导言
    • ImageView的使用

    十二. Layout布局
    • LinearLayout简述
    • RelativeLayout 相对布局
    • 使用 ConstraintLayout 构建自适应界面
    • 使用链控制线性组

    十三. DrawerLayout侧滑栏
    • Android DrawerLayout 使用示例
    十四. RecyclerView 显示列表
    • RecyclerView使用入门
    • RecyclerView实际使用
    • RecyclerView响应子项点击
    • RecyclerView显示多种item
    • RecyclerView获取滑动距离
    • clipToPadding介绍
    • 使用RecyclerView来创建一个颜色选择板
    • 侧滑删除,拖动排序
    • 瀑布流效果
    • 取消子项更新动画

    十五. 多线程
    • Android多线程综述
    • 线程池
    • Handler
    • 协程
    • AsyncTask 使用介绍

    十六. IO 操作
    • 读写文件
    • mmap 文件映射到内存介绍
    • MappedByteBuffer文件映射内存使用示例

    十七. 存储
    • SharedPreferences 简介
    十八. NetWork 网络
    • URLConnection
    • Android P 网络请求开始强制要求https
    • OkHttp

    十九. ProgressBar进度条
    • 进度条
    二十. View
    • View的综述
    • View.MeasureSpec简述
    • Android View post 方法

    二十一. 自定义View
    • 文字位置信息
    • 裁剪画布 canvas clip path
    • Android SurfaceView简介与使用
    • Android 自动缩放上下限的折线图

    二十二. 动画
    • Android应用的动画
    • 使用AnimationDrawable
    • 补间动画
    • ObjectAnimator 更改视图位置

    二十三. WebView
    • WebView 各项使用说明
    • 显示 html 文本
    • WebView 加载 assets 中的网页
    • WebView 加载本地存储的网页
    • WebView 在 NestedScrollView 中高度不稳定
    • 自定义长按文字弹出的菜单
    • x5 WebView 自定义长按菜单
    • js 调用 Java 方法

    二十四. StatusBar
    • 获取高度
    • Android7.0及以后沉浸式状态栏变灰问题
    二十五. Camera相机
    • Android 使用 Android Camera API 完成音视频的采集、编码、封包成 mp4 输出
    • Android 分别使用 SurfaceView 和 TextureView 来预览 Camera,获取NV21数据

    二十六. Media
    • MediaPlayer 多媒体播放器
    • Audio 音频
    • 视频
    • H.264简介
    • YUV格式简介

    二十七. Bluetooth 蓝牙
    • Android Bluetooth 蓝牙2.0使用方式
    • Android SPP连接蓝牙设备注意事项
    二十八. WiFi连接
    • 概述
    • 申请权限
    • WiFi信息扫描
    • 将WiFi搜索结果显示出来
    • 连接WiFi

    二十九. 获取手机当前角度
    • 姿态角度信息
    三十. launcher
    • 简易launcher

    三十一. AIDL
    • Android AIDL 了解与使用
    三十二. zip
    • Android 压缩字符串
    • 使用ZipFile进行解压

    三十三. Binder
    • Android Binder 机制介绍
    • Android Intent 传递数据大小限制
    三十四. Notification 通知
    • Notification 使用

    三十五. PackageManager
    • PackageManager的一些基础用法
    • 代码重启app的方法
    三十六. RTFSC
    • 认识 Android Context
    • Android SparseArray 原理解析

    三十七. 设计模式
    • 适配器模式 Adapter Pattern - Java实现
    • 监听者模式 - 在Java与Android中的使用
    • 桥接模式 Bridge Pattern
    • 建造者模式 Builder Pattern
    • 命令模式
    • 装饰者模式
    • 策略模式
    • 工厂方法
    • 迭代器
    • 中介者
    • 备忘录模式
    • 原型模式
    • 代理模式
    • 责任链模式
    • 状态模式
    • 模板方法模式
    • 访问者模式
    • 享元模式
    • 门面模式

    三十八. 第三方库
    • RxAndroid 使用方法
    • 汉字转拼音库 TinyPinyin
    • EventBus

    三十九. Android Studio
    • 使用Android Studio
    • SuppressWarnings
    • 从硬盘安装插件

    四十. 模块化
    • 重构工程,模块化思路和步骤
    • Android 蓝牙管理模块
    • 使用git submodule管理模块
    • 问题与方法

    四十一. Gradle
    • gradle简介
    • Gradle for Android开始
    • Gradle 基础自定义构建
    • Gradle 构建多种版本
    • Android Studio Gradle 下载速度慢解决方法

    四十二. NDK
    • 开始
    • JNI 返回值
    • 字符串的使用
    • 打 log
    • 访问域
    • Android NDK Makefile 相关示例
    • Android NDK 使用 .a文件
    • IO
    • NDK 中动态注册 JNI 方法
    • 用 sprintf 代替 itoa

    四十三. 调试
    • adb
    • 机器设置
    • ANR介绍

    Android Jetpack 全家桶全面学习

    一. 介绍
    • 在 Fragment 之间共享数据
    二. databinding
    • 使用databinding
    • 数据绑定
    • 使用可观察数据对象ObservableField
    • 点击事件
    • 表达式语言
    • layout中的data
    • databinding中的layout include
    • 双向数据绑
    • 绑定适配器定

    三. LiveData 事件传送
    • 准备数据类型
    • layout
    • Activity设置
    四. LifeCycle 生命周期
    • 活动
    • 状态转换
    • LifecycleOwner
    • 实现自定义 LifecycleOwner

    五. WorkManager
    • 入门示例
    • WorkManager工作约束,延迟与查询工作
    • WorkManager定时任务

    六. ViewModel
    • ViewModel 概览
    • Activity使用ViewModel
    • Activity与Fragment用同一个ViewModel

    七. 数据库
    • 开始使用Room
    • 实体类介绍
    • 添加数据(Insert)
    • 更新数据(Update)
    八. Paging
    • 前言
    • 目录
    • 从使用角度看结构
    • 分析准备
    • 数据的产生
    • 数据的消费

    因篇幅有限,《Android编程入门教程》内容较多,需要完整版《Android编程入门教程》文档可以扫描下方二维码免费获取~
    在这里插入图片描述

    展开全文
    qq_44102588 2021-10-08 14:32:39
  • Android 入门未分类语言基础常用类型基本类型/值类型booleanintfloatdouble引用类型StringClassCollection{List{ArrayList,LinkedList}Map{HashMap}}方法ex:public static void main(String[] args) {// 访问权限/...

    Android 入门

    未分类

    语言基础

    常用类型

    基本类型/值类型boolean

    int

    float

    double

    引用类型String

    Class

    Collection{

    List{

    ArrayList,

    LinkedList

    }

    Map{

    HashMap

    }

    }

    方法

    ex:public static void main(String[] args) {

    // 访问权限/方法类型/返回值/方法名(参数类型 参数名)

    }

    实例方法Person person = new Person();

    person.run();

    静态方法Person.run();

    多态

    抽象抽象类/class

    接口/interface

    拓展

    单继承/多实现

    继承Student extend Person

    实现Student implements Speakable

    异常try {

    //需要捕获异常的方法

    } catch (Exception e) {

    //发生异常

    } finally {

    //无论是不是异常都会走

    }

    泛型

    泛型接口

    //定义 T->泛化的类型 子类去具体化

    publicinterfaceSwitcher

    //实现

    publicclassFragmentSwitcherimplementsSwitcher

    泛型方法public T find(T t){

    }

    反射/注解/并发

    Android

    UI

    布局RelativeLayout

    LinearLayout

    FrameLayout

    控件TextView

    ImageView/SimpleDraweeView

    Button

    EditText

    RecycleView

    ViewPager

    组件

    Activity/Fragment

    承载显示布局

    生命周期

    Service/Broadcast Receiver/Content Provide

    Intent

    组件之间跳转/传值

    Bundle

    项目中使用

    项目按照页面/功能分模块,基本上每个目录对应一个页面/功能

    ex:liveroom/直播间

    livelist/直播列表

    home/首页

    mw/魔窗

    rn/React Native

    ....

    跳转

    view.setOnClickListener(newView.OnClickListener(){

    @Override

    publicvoidonClick(Viewv){

    //跳转逻辑

    SwitchFragmentUtil.switchToFragmentFromType("https:www.bolo.me");

    }

    })

    页面

    使用 Templates 创建

    不分页extends MvvmPageFragment>

    分页extends RefreshRecyclerFragment, V extends MvvmLceView, VM extends MvvmBaseViewModel>

    不分页 Tabextends RecyclerTab, VM extends MvvmBaseViewModel>

    分页 Tabextends RecyclerListTab, VM extends MvvmBaseViewModel>

    分页Modelextends BucketedList

    不分页ModelPaginatedList

    DataBinding

    Model->View

    展开全文
    weixin_31208627 2021-06-07 18:03:55
  • weixin_32306683 2021-06-05 05:40:08
  • weixin_36124750 2021-06-03 17:24:42
  • qq_44285551 2021-05-16 22:04:49
  • a332324956 2021-01-21 22:00:19
  • lishuqi_ 2021-08-13 01:31:52
  • Not_Mars 2021-01-07 18:14:57
  • weixin_35411561 2021-06-10 16:29:30
  • weixin_35433930 2021-03-09 06:18:40
  • m0_57081622 2021-10-13 14:02:43
  • qq_42257666 2021-08-10 20:20:13
  • qq_44572962 2021-05-27 14:07:24
  • weixin_29595351 2021-06-04 07:32:01
  • a772304419 2021-03-13 16:55:45
  • m0_53537576 2021-03-09 20:16:37
  • weixin_30590161 2021-06-06 11:35:05
  • m0_56255097 2021-05-12 17:51:34
  • pkpir 2021-03-15 18:57:17
  • weixin_35718575 2021-04-15 14:25:47
  • qq_43276983 2021-06-09 10:24:06
  • it_xiangqiang 2021-04-17 20:34:26
  • Android23333 2021-11-08 17:25:39
  • weixin_35728286 2021-06-08 16:34:57
  • weixin_42612804 2021-06-08 12:03:24

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 135,433
精华内容 54,173
关键字:

安卓入门

友情链接: atgp9.zip