android音乐播放器项目问题记录

前言

本文是在做Android Studio如何实现音乐播放器(简单易上手)项目时遇到的一些问题记录,答案不一定准确


目录

1.如何动态的添加碎片fragment?

2.ArrayAdapter详解

3.LayoutInflater的inflate方法

4.关于drawable和drawable-v24

5.View.inflate()方法

6.按钮颜色选择器怎么写

7.对服务的理解

8.活动和服务进行通讯

9.Bundle怎么保存和拿取数据

Tips:Intent怎么保存和拿取数据

10.默认值

11.CircleImageView是一个用于将图片圆形化的控件

12.报错:

13.报错:


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详解icon-default.png?t=M85Bhttps://www.jianshu.com/p/3b2da5604c40

android.R.layout.simple_list_item_1   一行text
android.R.layout.simple_list_item_2   一行title,一行text

对于适配器ArrayAdapter中getView方法重写icon-default.png?t=M85Bhttps://blog.csdn.net/lyj231025/article/details/49755231

继承ArrayAdapter类是重写getView()的作用是可以自定义列表中每一项的字的字体大小和颜色

3.LayoutInflater的inflate方法

Android LayoutInflater.inflate()使用详解icon-default.png?t=M85Bhttps://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();
                    }

完!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值