Android第一行代码--学习笔记(更新中ing)
Posted 电烤牛上脑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android第一行代码--学习笔记(更新中ing)相关的知识,希望对你有一定的参考价值。
O(∩_∩)O–作者 说:
请原谅我无耻的称自己为作者了!本文是作者看《android第一行代码》然后自己摘抄书上觉得对自己目前有用的内容,目前作者也是刚刚入门学习阶段,如果有错误希望大家多多指正。
PS:为什么我会写这几句没用的东西(因为昨天写的笔记突然好多人看。。。我慌了)只是分享看书而已!
最后,文章尽量日更,每次更新一点今天新学的东西,大家一起加油
Android第一行代码–学习笔记
认识四大组件
⭐️活动Activity
⭐️服务Service
⭐️广播接收器Broadcast Receiver
⭐️内容提供器Content Provider
AndroidMainfest.xml文件
简述:1.程序中定义的所有四大组件,都需要在这个文件里注册
2.给应用程序添加权限声明
其中:
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
这两行代码所在Activity,表示此Activity是主活动,点开本程序的入口
build.gradle文件
build.gradle(Project)
buildscript {
repositories {
jcenter() //代码托管仓库
}
dependencies {
classpath "com.android.tools.build:gradle:7.0.2"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31"
//声明gradle插件
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
build.gradle(Module)
plugins {
id 'com.android.application' //这是一个应用程序模块
id 'com.android.library' //这是一个库模块
}
android {
compileSdk 31 //指定项目的编译版本
defaultConfig {
applicationId "com.co.test" //指定项目包名
minSdk 26 //指定项目最低兼容Android系统版本
targetSdk 31 //运行时权限
versionCode 1 //项目版本号
versionName "1.0" //项目版本名
}
buildTypes { //用于指定安装文件的相关配置
release { //正式
minifyEnabled false //是否对项目代码进行混淆
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' //指定混淆时使用的规则文件
}
debug { //测试
minifyEnabled false
}
}
dependencies { //指定项目所有的依赖关系 1.本地依赖 2.库依赖 3.远程依赖
//需要啥用啥就是了。。。
}
Android日志工具Log
⭐️Log.v():用于打印琐碎,意义最小的日志信息
⭐️Log.d():用于打印一些调试信息
⭐️Log.i():用于打印一些比较重要的数据
⭐️Log.w():用于打印一些警告信息
⭐️Log.e():用于打印程序中的错误信息
加载布局的方法
🗡最基础方法
setContentView(R.Layout.home_layout)
Intent
核心:用于组件交互,包括当前组件想执行的动作和组件之间传递数据
显式Intent
🗡需求:启动目标活动
思路:Activity类提供了一个startActivity()方法,用于启动活动。此方法接收一个Intent参数,将构建好的Intent传入startActivity()方法即可。
Intent intent = new Intent(FirstActivity.this,SecondActivity.class)
startActivity(intent);
隐式Intent
🗡需求:启动目标活动
思路:大体同显式,但需要在AndroidMainfest文件中配置action和category标签
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
Intent intent = new Intent(com.example.activitytest.ACTION_START)
startActivity(intent);
Intent传递数据
🗡最简单的传递方式
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("键值",数据);//传递
startActivity(intent);
接收
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
🗡返回数据给上一个活动
思路:Activity中的startActivityForResult()方法也是用于启动活动的,这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。
[注意]:startActivityForResult()方法接收两个参数,第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1); //请求
返回
Intent intent = new Intent();
intent.putExtra("data_return","hello one");
setResult(RESULT_OK,intent);
finish();
在第一个activity中接收
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
switch(requestCode){
case 1:
if(resultCode == RESULT_OK) {
String returnedData = data.getStringExtra("data_return");
Log.d("FirstActivity",returnedData);
}
break;
default:
}
}
Fragment-动态添加碎片
private void replaceFragment(Fragment fragment){
FragmentManager fragmentManager = getSupportFragmentMannager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.right_layout,fragment);
transaction.addToBackStack(null); //补充:接收一个名字用于描述返回栈的状态(就是点back程序不会退出,而是回到上一个fragment)
transaction.commit();
}
//总结:
//1.创建待添加碎片,就是new一个fragment
//2.获取FragmentManager,可以直接在activity中getSupportFragmentMannager()调取
//3.开启一个事务,通过调用beginTransaction()方法开启
//4.向容器内添加或替换碎片,一般用replace()方法,其中需要传入容器id和待添加的碎片实例
//5.提交事务,调用commit()
调用Fragment(碎片)里的方法
RightFragment rightFragment = (RightFragment) getFragmentManager().findFragmentById(R.id.right_fragment);
//利用findFragmentById获取碎片实例
从Text中取值
String text = tv.getText().toString();
//实例化对象.getText().toString();
复杂的ListView
ListView的简单用法
🐰step1:创建一个布局xml文件,忽略。。
🐰step2:编写activity
//定义数据
private String[] data = {"Apple","Banana","Orange"};
//onCreate生命周期
@Override
protectd void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_1,data);
ListView listView = (ListView) findViewById(R.id.list_view);
ListView.setAdapter(adapter);
}
//adapter适配器 将ListView与数据data关联
定制ListView界面
🐰step3:定义一个实体类
public class Fruit {
private String name;
private int imageId;
public Fruit(String name,int imageId) {
this.name = name;
this.imageId = imageId;
}
public String getName() {
return name;
}
public int getImageId() {
return imaged;
}
}
🐰step4:自定义一个存放文本和图片的布局文件,fruit_item.xml
🐰step5:编写一个自定义适配器,泛型指定为Fruit类
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceId;
public FruitAdapter(Context context,int textViewResourceId,List<Fruit> objects) {
super(context,textViewResourceId,objects);
resourceId = textViewResourceId;
}
@Override
public View getView(int position,View convertView,ViewGroup parent){
Fruit fruit = getItem(position); //获取当前项的Fruit实例
View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
ImageView fruitImage = (ImageView)view.findViewById(R.id.fruit_image);
TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
fruitImage.setImageResource(fruit.getImagedId());
fruitName.setText(fruit.getName());
return view;
}
}
🐰step6:修改activity代码
@Override
protectd void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FruitAdapter<String> adapter = new FruitAdapter<String>(MainActivity.this,android.R.layout.simple_list_1,fruitList);
ListView listView = (ListView) findViewById(R.id.list_view);
ListView.setAdapter(adapter);
}
private void initFruits(){
for(int i=0;i<2;i++){//无意义循环,只是为了增加数据
Fruit apple = new Fruit("Apple",R.drawable.apple_pic);
fruitList.add(apple);
...//重复添加
}
}
ps:书上还有ListView代码优化的方法,感兴趣的可以看看
比ListView更强大的控件-----RecyclerView
。。。学习中。。。明天更
使用HttpURLConnection
简单流程:
URL url = new UPL("http://www.baidu.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//设置请求类型
connection.setRequestMethod("GET"); //发送GET请求 GET/POST
//设置请求超时
connection.setConnectTimeout(8000);//时间毫秒值
connection.setReadTimeout(8000);
//获取服务器返回的输入流
InputStream in = connection.getInputStream();
//关闭HTTP
connection.disconnect();
🗡需求:读取返回输入流
reader = new BufferedReader(new InputStreamReader(in));
StringBuilder response = new StringBuilder();
String line;
While((line = reader.readLine()) !==null ){
response.append(line);
}
showResponse(response.toString());
使用OkHttp(学一般发现没啥用emm)
首先,创建一个OkHttpClient的实例
OkHttpClient client = new OkHttpClient();
接下来如果想要发起一条HTTP请求,就需要创建一个Request对象:
Request request = new Request.Builder().build();
上述代码知识创建了一个空的Request对象,并没有什么实际作用,我们可以在最终的build()方法之前连缀许多其他方法来丰富这个request。
以上是关于Android第一行代码--学习笔记(更新中ing)的主要内容,如果未能解决你的问题,请参考以下文章
Android第一行代码学习笔记二---在活动中使用Toast
Android第一行代码学习笔记六---Intent向活动传递数据