Kennem's Blog
  • 🏠主页
  • 🔍搜索
  • 📚文章
  • ⏱时间轴
  • 🔖标签
  • 🗂️分类
  • 🙋🏻‍♂️关于
主页 » 🗂️ 分类

Android学习笔记

训练营第十天笔记

第十天笔记 内存泄漏 1. Java垃圾回收机制 1.1 什么是垃圾回收 垃圾回收(GC)是由Java虚拟机(JVM)垃圾回收器提供的一种内存回收机制。 当内存空间或内存占用过高时,系统会回收那些没有引用的对象。 JVM内存模型 运行时数据区域:包括方法区、堆、栈、本地方法栈和程序计数器等。 堆内存: 新生代(Young Generation):分为Eden区和两个Survivor区(S0、S1)。 老年代(Old Generation)。 方法区(MetaSpace):存储类元数据、方法信息等。 1.2 判断对象是否是垃圾的算法 1.2.1 引用计数算法 对象被创建后,系统为其初始化引用计数器。 每当对象被引用时,计数器加1,引用失效时,计数器减1。 当计数器为0时,对象不再被引用,可以进行回收。 优点:判断简单,效率高。 缺点:无法避免循环引用。 1.2.2 可达性分析法 从GC Roots出发,逐步遍历到所有可达的对象。 这些对象称为可达对象,不可达的对象则被标记为垃圾,需要回收。 GC Roots包括的对象: 虚拟机栈中引用的对象(栈帧中的本地变量表)。 方法区中类静态属性引用的对象。 方法区中常量引用的对象。 本地方法栈中JNI(Native方法)引用的对象。 Java中的对象引用 Java中的对象引用主要分为四种类型: ...

2024-07-15 · 3 分钟 · 1411 字 · updated: 2024-07-15 · ShowGuan

训练营第九天笔记

第九天笔记 权限与网络请求课程预习 1. 有哪些权限,具体权限的介绍 普通权限 网络权限:允许设备访问网络 <uses-permission android:name="android.permission.INTERNET" /> 获取网络的状态:如是否有网 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 读取手机状态:如IMEI等信息 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 获取WiFi的状态 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 敏感权限 写入SDK权限:文件下载、图片下载 ...

2024-07-14 · 7 分钟 · 3076 字 · updated: 2024-07-14 · ShowGuan

训练营第八天笔记

第八天笔记 自定义控件的实现 View 绘制过程 Activity 和 View 的关系 Window 类:负责在 Activity 中展示内容(具体实现为 PhoneWindow 类) DecorView:Window 创建出根布局 DecorView(继承自 FrameLayout) 单个 View 的绘制步骤 系统根据布局树完成界面绘制,单个 View 需要经过三个步骤: ...

2024-07-13 · 11 分钟 · 5178 字 · updated: 2024-07-13 · ShowGuan

训练营第七天笔记

第七天笔记 Android 动画 帧动画 作用对象 视图控件 (View) 例如 Android 的 TextView、Button 等等 不可作用于 View 组件的属性,如:颜色、背景、长度等等 使用 资源文件方式 代码方式 资源文件方式 基本信息介绍 ...

2024-07-12 · 4 分钟 · 1600 字 · updated: 2024-07-12 · ShowGuan

训练营第六天学习笔记

第六天笔记 组件库笔记 1. 组件库依赖、发布和使用 依赖方式对比 2.x版本 3.x版本 说明 apk runtimeOnly apk 功能同 runtimeOnly。只在生成 apk 时参与打包,编译时不会参与。Gradle 只会将依赖项添加到构建输出,以便在运行时使用。 provided compileOnly provided 功能同 compileOnly。只在编译时有效,不会参与打包至 apk。 compile api compile 功能同 api。该依赖方式会传递所依赖的库,当其他 module 依赖了该 module 时,可以使用该 module 下使用 api 依赖的库。 - implementation 该依赖方式所依赖的库不会传递,只会在当前 module 中生效。 格式介绍 格式 介绍 差异 AAR AAR 文件包含了 Android 库项目的代码、资源文件和清单文件等信息,可以被其他 Android 应用程序引用和使用。 Android 特有的归档文件格式,主要用于打包 Android 库项目。 JAR JAR 文件包含了 Java 类文件、资源文件和清单文件等信息,可以被其他 Java 应用程序引用和使用。 Java 中常用的归档文件格式,用于打包 Java 类库和应用程序。 依赖添加方式 本地依赖 ...

2024-07-11 · 6 分钟 · 2894 字 · updated: 2024-07-11 · ShowGuan

训练营第四天学习笔记

第四天笔记 Android UI 课程重点知识笔记 1. 了解Android控件常用属性 Android:id 任何 View 对象均可拥有与之关联的整型 ID,用于在结构树中对 View 对象进行唯一标识。 系统会以整型形式引用此 ID。 在布局 XML 文件中,系统通常以字符串的形式在 android:id 属性中指定该 ID。 // 使用系统资源 android:id="@android:id/androidView" // 使用自己创建的资源 android:id="@+id/myView" // 标识创建一个新资源 android:id="@id/myView" // 使用现有资源 android:layout_width 和 android:layout_height android:layout_width 和 android:layout_height 分别表示控件的宽度和高度。 取值为 wrap_content、match_parent 和具体的数值(如 40dp)。 wrap_content:表示控件宽度/高度由内容决定。 match_parent:表示控件宽度/高度为父view允许的最大值。 <View android:layout_width="wrap_content" // 设置宽 android:layout_height="wrap_content" // 设置高 /> 2. 了解文本框 TextView TextView 介绍 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <TextView android:layout_width="wrap_content" // 设置文字 android:layout_height="wrap_content" android:background="@color/teal_200" // 设置背景颜色 android:text="Hello World" // 设置文本内容 android:textSize="20dp" // 设置文字大小 android:textColor="#FAFA02" // 设置文字颜色 android:textStyle="bold"/> // 设置文字样式(normal, bold, italic) </LinearLayout> 3. 了解按钮 Button Button 介绍 Button:在 UI 上生成一个按钮,用户点击时触发 onclick 事件。 ...

2024-07-10 · 4 分钟 · 1802 字 · updated: 2024-07-10 · ShowGuan

训练营第五天学习笔记

第五天笔记 Android 布局与优化 基本布局 公共属性 布局类型 共有属性 layout_gravity: 控件相对于父控件的对齐方式 gravity: 控件内部的对齐方式 padding: 内间距 paddingTop: 上间距 paddingBottom: 下间距 paddingLeft: 左间距~ paddingRight: 右间距 layout_width: 控件的宽度 layout_height: 控件的高度 layout_margin: 外间距 layout_marginLeft: 控件的左间距 layout_marginRight: 控件的右间距 layout_marginTop: 控件的上间距 layout_marginBottom: 控件的下间距 示例代码 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="300dp" android:layout_height="300dp" android:layout_weight="1" android:gravity="bottom" android:text="AA" android:textSize="30sp" android:background="@color/colorPrimary" /> <TextView android:layout_width="200dp" android:layout_height="200dp" android:layout_weight="2" android:gravity="bottom" android:text="BB" android:textSize="30sp" android:background="@color/colorAccent" /> <TextView android:layout_width="100dp" android:layout_height="100dp" android:layout_weight="3" android:gravity="bottom" android:text="CC" android:textSize="30sp" android:background="@color/colorPrimaryDark" /> </FrameLayout> 基本布局 FrameLayout 特点:FrameLayout 允许子视图堆叠在一起,只显示最后添加的子视图。 示例代码 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="300dp" android:layout_height="300dp" android:layout_weight="1" android:gravity="bottom" android:text="AA" android:textSize="30sp" android:background="@color/colorPrimary" /> <TextView android:layout_width="200dp" android:layout_height="200dp" android:layout_weight="2" android:gravity="bottom" android:text="BB" android:textSize="30sp" android:background="@color/colorAccent" /> <TextView android:layout_width="100dp" android:layout_height="100dp" android:layout_weight="3" android:gravity="bottom" android:text="CC" android:textSize="30sp" android:background="@color/colorPrimaryDark" /> </FrameLayout> 效果:如右侧预览图所示,三个TextView控件堆叠在一起,显示最上层的控件内容。 LinearLayout 特点:LinearLayout 以线性排列子视图,可以设置为水平或垂直布局。 属性介绍 orientation:排列方式 horizontal:水平布局 vertical:垂直布局 layout_weight:权重 使用比例的方式来指定控件的大小 属性关系图 属性 ├─ orientation 排列方式 │ ├─ horizontal 水平布局 │ └─ vertical 垂直布局 └─ layout_weight 权重:使用比例的方式来指定控件的大小 以上为Android布局中的FrameLayout和LinearLayout的基本概念与属性介绍。 ...

2024-07-10 · 4 分钟 · 1941 字 · updated: 2024-07-10 · ShowGuan

训练营第三天学习笔记

第三天笔记 Fragment 重点知识总结 1. fragment背景 Fragment的诞生 引入版本: Android 3.0 (API 11) 背景和目的: 初衷是为了适应大屏幕的平板电脑,由于平板电脑的屏幕比手机屏幕更大,因此可以容纳更多的UI组件,且这些UI组件之间存在交互关系。 ...

2024-07-09 · 3 分钟 · 1097 字 · updated: 2024-07-09 · ShowGuan

训练营第二天学习笔记

第二天笔记 Android 四大组件课程概要总结 1. Activity a. 创建 自动创建 在新建项目后,会自动为我们创建一个 MainActivity。Activity 组成部分如下: 继承自 Activity 的类 放在 res/layout 文件夹的布局 XML 文件 在 AndroidManifest.xml 文件中声明 b. Activity 生命周期回调方法 ...

2024-07-08 · 9 分钟 · 4405 字 · updated: 2024-07-08 · ShowGuan

训练营第一天学习笔记

第一天学习笔记 老师:唐鸿程 Android按照运行方式分为3阶段 JIT AOT AOT+JIT Android系统可以分5层 kernel 层 ,硬件抽象层 , art c++层 , java framework层 , app层 字节码对齐(Bytecode Alignment):在 Android 应用开发中是一个优化步骤,旨在提高应用程序的启动速度和运行效率。它主要用于优化 DEX 文件的加载过程。 ...

2024-07-07 · 2 分钟 · 701 字 · updated: 2024-06-17 · ShowGuan

Android内存管理知识点

Android内存管理知识点 问题 1: 什么是垃圾回收机制? 解答: 垃圾回收(GC)是由Java虚拟机(JVM)垃圾回收器提供的一种对内存回收的机制。它会在内存空间不足或者内存占用过高的时候,自动回收那些没有引用的对象,以释放内存资源。垃圾回收的主要目标是自动管理内存,避免内存泄漏和内存溢出。 ...

2024-07-04 · 11 分钟 · 5391 字 · updated: 2024-07-04 · ShowGuan

Android(6)

Android(6) 记账本小项目 BillPagerActivity.java package com.showguan.chapter08; import android.app.DatePickerDialog; import android.content.Intent; import android.media.Image; import android.os.Bundle; import android.util.TypedValue; import android.view.View; import android.widget.DatePicker; import android.widget.ImageView; import android.widget.TextView; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import androidx.viewpager.widget.PagerTabStrip; import androidx.viewpager.widget.ViewPager; import com.showguan.chapter08.adapter.BillPagerAdapter; import com.showguan.chapter08.database.BillDBHelper; import com.showguan.chapter08.util.DateUtil; import org.w3c.dom.Text; import java.util.Calendar; public class BillPagerActivity extends AppCompatActivity implements View.OnClickListener, DatePickerDialog.OnDateSetListener { private Calendar calendar; private TextView tv_month; private ViewPager vp_bill; private BillDBHelper mDBhelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bill_pager); TextView tv_title = findViewById(R.id.tv_title); TextView tv_subtitle = findViewById(R.id.tv_subtitle); ImageView iv_back = findViewById(R.id.iv_back); iv_back.setOnClickListener(this); tv_month = findViewById(R.id.tv_month); tv_title.setText("帐单列表"); tv_subtitle.setText("添加账单"); tv_subtitle.setOnClickListener(this); calendar = Calendar.getInstance(); tv_month.setText(DateUtil.getMonth(calendar)); tv_month.setOnClickListener(this); mDBhelper = BillDBHelper.getInstance(this); mDBhelper.openReadLink(); mDBhelper.openWriteLink(); initViewPager(); } // 初始化ViewPager private void initViewPager() { PagerTabStrip pts_bill = findViewById(R.id.pts_bill); pts_bill.setTextSize(TypedValue.COMPLEX_UNIT_SP, 17); vp_bill = findViewById(R.id.vp_bill); BillPagerAdapter adapter = new BillPagerAdapter(getSupportFragmentManager(), calendar.get(Calendar.YEAR)); vp_bill.setAdapter(adapter); vp_bill.setCurrentItem(calendar.get(Calendar.MONTH)); } @Override public void onClick(View v) { if(v.getId() == R.id.tv_month){ DatePickerDialog dialog = new DatePickerDialog(this, this, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH) ); dialog.show(); } else if (v.getId() == R.id.tv_subtitle) { Intent intent = new Intent(this, BillAddActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); } else if (v.getId() == R.id.iv_back) { finish(); } } @Override public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month); calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); tv_month.setText(DateUtil.getMonth(calendar)); vp_bill.setCurrentItem(calendar.get(Calendar.MONTH)); } @Override public void onPointerCaptureChanged(boolean hasCapture) { super.onPointerCaptureChanged(hasCapture); } @Override protected void onDestroy() { super.onDestroy(); mDBhelper.closeLink(); } } BillAddActivity.java package com.showguan.chapter08; import android.app.DatePickerDialog; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.DatePicker; import android.widget.EditText; import android.widget.ImageView; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.showguan.chapter08.database.BillDBHelper; import com.showguan.chapter08.entity.BillInfo; import com.showguan.chapter08.util.DateUtil; import com.showguan.chapter08.util.ToastUtil; import java.util.Calendar; import java.util.Date; public class BillAddActivity extends AppCompatActivity implements View.OnClickListener, DatePickerDialog.OnDateSetListener { private static final String TAG = "Kennem"; private TextView tv_date; private Calendar calendar; private TextView tv_subtitle; private TextView tv_title; private RadioButton rb_in; private RadioButton rb_out; private EditText et_remark; private EditText et_amount; private Button btn_save; private RadioGroup rg_type; private BillDBHelper mDBhelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bill_add); tv_title = findViewById(R.id.tv_title); tv_subtitle = findViewById(R.id.tv_subtitle); rg_type = findViewById(R.id.rg_type); rb_in = findViewById(R.id.rb_in); rb_out = findViewById(R.id.rb_out); et_remark = findViewById(R.id.et_remark); et_amount = findViewById(R.id.et_amount); btn_save = findViewById(R.id.btn_save); ImageView iv_back = findViewById(R.id.iv_back); iv_back.setOnClickListener(this); tv_title.setText("请记录账单"); tv_subtitle.setText("账单列表"); tv_subtitle.setOnClickListener(this); tv_date = findViewById(R.id.tv_date); calendar = Calendar.getInstance(); tv_date.setText(DateUtil.getDate(calendar)); tv_date.setOnClickListener(this); btn_save.setOnClickListener(this); mDBhelper = BillDBHelper.getInstance(this); mDBhelper.openReadLink(); mDBhelper.openWriteLink(); } @Override public void onClick(View v) { if (v.getId() == R.id.tv_date) { DatePickerDialog dialog = new DatePickerDialog(this, this, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH) ); dialog.show(); } else if (v.getId() == R.id.btn_save) { BillInfo bill = new BillInfo(); bill.date = tv_date.getText().toString(); bill.type = rg_type.getCheckedRadioButtonId() == R.id.rb_in ? BillInfo.BILL_TYPE_INCOME : BillInfo.BILL_TYPE_COSE; bill.remark = et_remark.getText().toString(); bill.amount = Double.parseDouble(et_amount.getText().toString()); Log.d(TAG, bill.toString()); if (mDBhelper.save(bill) > 0) { ToastUtil.show(this, "添加账单成功"); } } else if (v.getId() == R.id.iv_back) { finish(); } else if (v.getId() == R.id.tv_subtitle) { Intent intent = new Intent(this, BillPagerActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); } } @Override public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month); calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); tv_date.setText(DateUtil.getDate(calendar)); } @Override protected void onDestroy() { super.onDestroy(); } } BillPagerAdapter.java package com.showguan.chapter08.adapter; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; import com.showguan.chapter08.fragment.BillFragment; public class BillPagerAdapter extends FragmentPagerAdapter { private final int mYear; private static final String TAG = "Kennem"; public BillPagerAdapter(@NonNull FragmentManager fm, int year) { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); this.mYear = year; } @NonNull @Override public Fragment getItem(int position) { Log.d(TAG, String.valueOf(position)); int month = position + 1; String zeroMonth = month < 10 ? "0" + month : "" + month; String yearMonth = mYear + "-" + zeroMonth; Log.d(TAG, yearMonth); return BillFragment.newInstance(yearMonth); } @Override public int getCount() { return 12; } @Nullable @Override public CharSequence getPageTitle(int position) { return (position + 1) + "月份"; } } BillListAdapter.java package com.showguan.chapter08.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import com.showguan.chapter08.R; import com.showguan.chapter08.entity.BillInfo; import java.util.List; public class BillListAdapter extends BaseAdapter { private final List<BillInfo> mBillInfoList; private final Context mContext; public BillListAdapter(Context context, List<BillInfo> billInfoList) { this.mContext = context; this.mBillInfoList = billInfoList; } @Override public int getCount() { return mBillInfoList.size(); } @Override public Object getItem(int position) { return mBillInfoList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if(convertView == null){ viewHolder = new ViewHolder(); convertView = LayoutInflater.from(mContext).inflate(R.layout.item_bill, null); viewHolder.tv_date = convertView.findViewById(R.id.tv_date); viewHolder.tv_remark = convertView.findViewById(R.id.tv_remark); viewHolder.tv_amount = convertView.findViewById(R.id.tv_amount); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } BillInfo billInfo = mBillInfoList.get(position); viewHolder.tv_date.setText(billInfo.date); viewHolder.tv_remark.setText(billInfo.remark); viewHolder.tv_amount.setText(String.format("%s %d 元", billInfo.type == 0 ? "+" : "-" ,(int)billInfo.amount)); return convertView; } public final class ViewHolder{ public TextView tv_date; public TextView tv_remark; public TextView tv_amount; } } BillDBHelper.java package com.showguan.chapter08.database; import android.annotation.SuppressLint; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import androidx.annotation.Nullable; import com.showguan.chapter08.entity.BillInfo; import java.util.ArrayList; import java.util.List; public class BillDBHelper extends SQLiteOpenHelper { private static String TAG = "Kennem"; private static final String DB_NAME = "bill.db"; private static final String TABLE_BILL_INFO = "bill_info"; private static final int DB_VERSION = 2; private static BillDBHelper mHelper = null; private SQLiteDatabase mRDB = null; private SQLiteDatabase mWDB = null; private BillDBHelper(@Nullable Context context) { super(context, DB_NAME, null, DB_VERSION); } public static BillDBHelper getInstance(Context context) { if (mHelper == null) { mHelper = new BillDBHelper(context); } return mHelper; } public SQLiteDatabase openReadLink() { if (mRDB == null || !mRDB.isOpen()) { mRDB = mHelper.getReadableDatabase(); } return mRDB; } public SQLiteDatabase openWriteLink() { if (mWDB == null || !mWDB.isOpen()) { mWDB = mHelper.getReadableDatabase(); } return mWDB; } public void closeLink() { if (mRDB != null && mRDB.isOpen()) { mRDB.close(); mRDB = null; } if (mWDB != null && mWDB.isOpen()) { mWDB.close(); mWDB = null; } } @Override public void onCreate(SQLiteDatabase db) { //_id 保证id不是不是关键字 String sql = null; sql = "CREATE TABLE IF NOT EXISTS " + TABLE_BILL_INFO + " (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + " date VARCHAR NOT NULL," + " type VARCHAR NOT NULL," + " amount DOUBLE NOT NULL," + " remark VARCHAR NOT NULL);"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } public long save(BillInfo billInfo) { ContentValues cv = new ContentValues(); cv.put("date", billInfo.date); cv.put("type", billInfo.type); cv.put("amount", billInfo.amount); cv.put("remark", billInfo.remark); return mWDB.insert(TABLE_BILL_INFO, null, cv); } @SuppressLint("Range") public List<BillInfo> queryByMonth(String yearMonth){ List<BillInfo> list = new ArrayList<>(); String sql = "select * from " + TABLE_BILL_INFO + " where date like '" + yearMonth + "%';"; Log.d(TAG, sql); Cursor cursor = mRDB.rawQuery(sql, null); while(cursor.moveToNext()){ BillInfo bill = new BillInfo(); bill.id = cursor.getInt(cursor.getColumnIndex("_id")); bill.date = cursor.getString(cursor.getColumnIndex("date")); bill.type = cursor.getInt(cursor.getColumnIndex("type")); bill.amount = cursor.getDouble(cursor.getColumnIndex("amount")); bill.remark = cursor.getString(cursor.getColumnIndex("remark")); Log.d(TAG, bill.toString()); list.add(bill); } return list; } } BillInfo.java package com.showguan.chapter08.entity; public class BillInfo { public int id; public String date; public int type; public double amount; public String remark; public static final int BILL_TYPE_INCOME = 0; public static final int BILL_TYPE_COSE = 1; @Override public String toString() { return "BillInfo{" + "id=" + id + ", date='" + date + '\'' + ", type=" + type + ", amount=" + amount + ", remark='" + remark + '\'' + '}'; } } BillFragment.java package com.showguan.chapter08.fragment; import android.os.Bundle; import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import com.showguan.chapter08.R; import com.showguan.chapter08.adapter.BillListAdapter; import com.showguan.chapter08.database.BillDBHelper; import com.showguan.chapter08.entity.BillInfo; import java.util.List; public class BillFragment extends Fragment { public BillFragment() { } public static BillFragment newInstance(String yearMonth) { BillFragment fragment = new BillFragment(); Bundle args = new Bundle(); args.putString("yearMonth", yearMonth); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_bill, container, false); ListView lv_bill = view.findViewById(R.id.lv_bill); BillDBHelper mDBHelper = BillDBHelper.getInstance(getContext()); Bundle arguments = getArguments(); String yearMonth = arguments.getString("yearMonth"); List<BillInfo> billInfoList = mDBHelper.queryByMonth(yearMonth); BillListAdapter adapter = new BillListAdapter(getContext(), billInfoList); lv_bill.setAdapter(adapter); return view; } } 广播 广播的收发过程分为三个步骤: 发送标准广播 定义广播接收器 开关广播接收器 有序广播 ...

2024-07-01 · 4 分钟 · 1899 字 · updated: 2024-07-01 · ShowGuan

Android(5)

Android(5) 高级控件 SpinnerDialog + ArrayAdapter XML <?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:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".SpinnerDropdownActivity" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="下拉模式的列表框" android:textSize="17sp"/> <Spinner android:id="@id/sp_dialog" android:layout_width="match_parent" android:layout_height="wrap_content" android:spinnerMode="dialog"/> </LinearLayout> item_select.xml <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:textColor="#0000ff" android:textSize="17sp" tools:text="火星"> </TextView> Java package com.showguan.chapter08; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; import androidx.appcompat.app.AppCompatActivity; import com.showguan.chapter08.util.ToastUtil; public class SpinnerDialogActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener { private Spinner sp_dialog; private static final String[] starArray = new String[]{ "水星", "金星", "地球", "火星", "木星", "土星", "天王星", "海王星" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_spinner_dialog); sp_dialog = findViewById(R.id.sp_dialog); ArrayAdapter<String> starAdapter = new ArrayAdapter<>(this, R.layout.item_select, starArray); sp_dialog.setPrompt("🌤选择行星"); sp_dialog.setAdapter(starAdapter); sp_dialog.setSelection(0); sp_dialog.setOnItemSelectedListener(this); } @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { ToastUtil.show(this, "您选择了: " + starArray[position]); } @Override public void onNothingSelected(AdapterView<?> parent) { } } SpinnerDropdown ...

2024-06-29 · 13 分钟 · 6251 字 · updated: 2024-06-29 · ShowGuan

Android(4)

Android(4) 就算是最低的15x15都已经不错了,以后还有时间去学,上了研究生也没人能保证你有15x15的收入 内容提供者(ContentProvider) CountentProvider为App存取内部数据提供统一的外部接口,让不同的应用之间得以共享数据 ...

2024-06-26 · 15 分钟 · 7505 字 · updated: 2024-06-29 · ShowGuan

Android(3)

Android(3) 清楚自己是在为了什么而努力,以后能得到什么,你想要什么结果。 数据存储 共享参数的用法 SharedPreferences 是 Android的一个轻量级存储工具,采用的存储结构是key-value的键值对方式 共享参数的存储介质是符合XML规范的配置文件。保存路径是:/data/data/应用包名/shared_prefs/文件名.xml 共享参数主要适用的场合: ...

2024-06-21 · 15 分钟 · 7102 字 · updated: 2024-06-21 · ShowGuan
« 上一页  下一页  »
© 2025 Kennem's Blog · Powered by Hugo & PaperMod
👤 Visitors: 👀 Views: