前言
本文是在做Android Studio如何实现音乐播放器(简单易上手)项目时遇到的一些问题记录,答案不一定准确
目录
11.CircleImageView是一个用于将图片圆形化的控件
1.如何动态的添加碎片fragment?
观察MainActivity的父类可以看到父类有Activity,Activity的父类有Context
MainActivity extends AppCompatActivity
AppCompatActivity extends FragmentActivity
FragmentActivity extends ComponentActivity
ComponentActivity extends androidx.core.app.ComponentActivity
ComponentActivity extends Activity
Activity extends ContextThemeWrapper
ContextThemeWrapper extends ContextWrapper
ContextWrapper extends Context
Context是一个抽象类,不继承任何类也不实现任何接口
首先在活动中调用getSupportFragmentManager()获取FragmentManager对象,然后调用对象的beginTransaction()开启一个事务,返回FragmentTransaction对象,接着调用该对象的replace()方法,方法分别接受一个容器id和一个Fragment实例,表明在该容器下替换碎片,最后调用commit()方法提交事务。
2.ArrayAdapter详解
Android之ArrayAdapter详解https://www.jianshu.com/p/3b2da5604c40
android.R.layout.simple_list_item_1 一行text
android.R.layout.simple_list_item_2 一行title,一行text
对于适配器ArrayAdapter中getView方法重写https://blog.csdn.net/lyj231025/article/details/49755231
继承ArrayAdapter类是重写getView()的作用是可以自定义列表中每一项的字的字体大小和颜色
3.LayoutInflater的inflate方法
Android LayoutInflater.inflate()使用详解https://www.jianshu.com/p/c92243287793
4.关于drawable和drawable-v24
不同的drawable文件夹用于为设备兼容性和不同的Android版本提供不同的屏幕密度。
5.View.inflate()方法
看源码可以看到其实也是LayoutInflater.from(context).inflate(resource,root)
public static View inflate(Context context, @LayoutRes int resource, ViewGroup root) {
LayoutInflater factory = LayoutInflater.from(context);
return factory.inflate(resource, root);
}
6.按钮颜色选择器怎么写
右击drawable文件夹,New---Drawable Resource File
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<corners android:radius="10dp"/>
<solid android:color="#d4d4d4"/>
</shape>
</item>
<item android:state_pressed="false">
<shape android:shape="rectangle">
<corners android:radius="10dp"/>
<solid android:color="#ffffff"/>
</shape>
</item>
</selector>
然后在layout的xml文件中设置背景:android:background="@drawable/btn_bg_selector"
7.对服务的理解
android不允许在子线程中进行UI操作
android提供了一套异步消息处理机制:Message,Handler,MessageQueue,Looper
首先需要在主线程中创建一个Handler对象,并重写handleMessage()方法。当子线程进行UI操作时,就创建一个Message对象,并通过Handler将这条消息发送出去。之后这条消息会被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从HandlerQueue中取出待处理消息,最后分发回Handler的handleMessage()方法中。
8.活动和服务进行通讯
比如在服务中提供一个下载功能,在Service类中新建一个XXXBinder类继承Binder,然后在内部提供具体方法,接着创建XXXBinder的实例,在onBinder()方法中返回这个实例
然后在主类中创建ServiceConnection的匿名类,里面重写了onServiceConnected()方法和onServiceDisconnected
再然后startService()方法修改成bindService()方法
9.Bundle怎么保存和拿取数据
putString()保存字符串,putInt()保存整型数据,传入两个参数,第一个参数是建,第二个参数是真正要保存的值
getString()用于接收值,只需要传一个参数---键
---保存和拿取两个方法都是实例方法
Tips:Intent怎么保存和拿取数据
putExtra()方法保存数据,接收两个参数,第一个参数是建,第二个参数是真正要保存的值
getStringExtra()获取字符串数据,getIntExtra()获取整型数据,getBooleanExtra()获取布尔型数据
10.默认值
默认值,int(0),short(0),byte(0),long(0),float(0.0),double(0.0),char(\u0000),boolean(false),String(null);
11.CircleImageView是一个用于将图片圆形化的控件
implementation 'de.hdodenhof:circleimageview:3.0.1'
<de.hdodenhof.circleimageview.CircleImageView />
12.报错:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.reset()' on a null object reference
解决:
onCreate()方法里忘记new MediaPlayer()
@Override
public void onCreate() {
super.onCreate();
mediaPlayer = new MediaPlayer();
}
13.报错:
点击播放后拖动进度条或者点击播放后再点击暂停再点击继续就会闪退,报如下错误:
报错:
E/AndroidRuntime: FATAL EXCEPTION: Timer-0
Process: com.jack.music_list, PID: 16933
java.lang.IllegalStateException
解决:加try catch
try {
if (mediaPlayer == null) return;
int currentPosition = mediaPlayer.getCurrentPosition();
int duration = mediaPlayer.getDuration();
Message message = MusicActivity.handler.obtainMessage();
Bundle data = new Bundle();
data.putInt("currentPosition", currentPosition);
data.putInt("duration", duration);
message.setData(data);
MusicActivity.handler.sendMessage(message);
} catch (Exception e) {
e.printStackTrace();
}
完!