增加我的收藏功能

pull/1/head
jsyjst 7 years ago
parent 0961bdac43
commit 733250899f

@ -2,11 +2,12 @@
<litepal>
<dbname value="SongList"></dbname>
<version value="6"></version>
<version value="8"></version>
<list>
<mapping class="com.example.musicplayer.entiy.OnlineSong"></mapping>
<mapping class="com.example.musicplayer.entiy.LocalSong"></mapping>
<mapping class="com.example.musicplayer.entiy.History"></mapping>
<mapping class="com.example.musicplayer.entiy.Love"></mapping>
</list>
</litepal>

@ -0,0 +1,137 @@
package com.example.musicplayer.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.musicplayer.R;
import com.example.musicplayer.entiy.Love;
import com.example.musicplayer.util.FileHelper;
import java.util.List;
/**
* Created by on 2018/11/30.
*/
public class LoveSongAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG = "LoveSongAdapter";
private int footerViewType = 1;
private int itemViewType = 0;
private List<Love> mLoveList;
private Context mContext;
private int mLastPosition = -1;
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public LoveSongAdapter(Context context, List<Love> loveList) {
mContext = context;
mLoveList = loveList;
}
class ViewHolder extends RecyclerView.ViewHolder {
TextView songNameTv;
TextView singerTv;
View mItemView;
View playLine;
public ViewHolder(View itemView) {
super(itemView);
songNameTv = itemView.findViewById(R.id.tv_title);
singerTv = itemView.findViewById(R.id.tv_artist);
playLine = itemView.findViewById(R.id.line_play);
mItemView = itemView;
}
}
/**
* holder
*/
static class FooterHolder extends RecyclerView.ViewHolder {
TextView numTv;
public FooterHolder(View itemView) {
super(itemView);
numTv = itemView.findViewById(R.id.tv_song_num);
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == itemViewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_song_search_item, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
} else {
View footerView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.footer_local_songs_item, parent, false);
FooterHolder footerHolder = new FooterHolder(footerView);
return footerHolder;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
if (viewHolder instanceof ViewHolder) {
ViewHolder holder = (ViewHolder) viewHolder;
final Love love = mLoveList.get(position);
holder.songNameTv.setText(love.getName());
holder.singerTv.setText(love.getSinger());
//根据点击显示
if(love.getSongId().equals(FileHelper.getSong().getOnlineId())){
holder.playLine.setVisibility(View.VISIBLE);
mLastPosition =position;
holder.mItemView.setBackgroundResource(R.color.click);
}else {
holder.playLine.setVisibility(View.INVISIBLE);
holder.mItemView.setBackgroundResource(R.color.transparent);
}
holder.mItemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.onSongClick(position);
equalPosition(position);
}
});
} else {
FooterHolder footerHolder = (FooterHolder) viewHolder;
footerHolder.numTv.setText("共" + mLoveList.size() + "首音乐");
}
}
//判断点击的是否为上一个点击的项目
public void equalPosition(int position) {
if (position != mLastPosition) {
notifyItemChanged(mLastPosition);
mLastPosition = position;
}
notifyItemChanged(position);
}
@Override
public int getItemCount() {
return mLoveList.size() + 1;
}
@Override
public int getItemViewType(int position) {
return position + 1 == getItemCount() ? footerViewType : itemViewType;
}
public interface OnItemClickListener {
void onSongClick(int position);
}
}

@ -9,6 +9,7 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.musicplayer.constant.Constant;
import com.example.musicplayer.constant.MyApplication;
import com.example.musicplayer.entiy.Song;
import com.example.musicplayer.R;
@ -73,10 +74,6 @@ public class SongAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
if (viewType == itemViewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_song_item, parent, false);
// TypedValue typedValue = new TypedValue();
// mContext.getTheme().resolveAttribute(R.attr.selectableItemBackground, typedValue, true);
// view.setBackgroundResource(typedValue.resourceId);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
} else {
@ -123,6 +120,8 @@ public class SongAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
song.setDuration(mp3Info.getDuration());
song.setCurrent(position);
song.setOnline(false);
song.setOnlineId(mp3Info.getSongId());
song.setListType(Constant.LIST_TYPE_LOCAL);
FileHelper.saveSong(song);
onItemClickListener.onSongClick();
@ -131,7 +130,8 @@ public class SongAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
});
} else {
FooterHolder footerHolder = (FooterHolder) viewHolder;
footerHolder.numTv.setText("共" + mMp3InfoList.size() + "首音乐");
int num=mMp3InfoList.size()-1;
footerHolder.numTv.setText("共" + num + "首音乐");
}
}

@ -13,5 +13,6 @@ public class BroadcastName {
public static final String SONG_RESUME="song_resume";
public static final String ONLINE_SONG_ERROR="online_song_error";
public static final String ONLINE_ALBUM_SONG_Change="online_album_song_change";
public static final String LOVE_SONG_CHANGE="love_song_change";
}

@ -11,4 +11,5 @@ public class Constant {
public static final int TYPE_ALBUM_SONG=3;
public static final int LIST_TYPE_LOCAL=4;
public static final int LIST_TYPE_ONLINE=5;
public static final int LIST_TYPE_LOVE=6;
}

@ -1,5 +1,8 @@
package com.example.musicplayer.contract;
import com.example.musicplayer.entiy.Love;
import com.example.musicplayer.entiy.Song;
/**
* Created by on 2018/10/26.
*/
@ -7,17 +10,27 @@ package com.example.musicplayer.contract;
public interface IPlayContract {
interface Model{
void getSingerImg(String singer);//网络请求获得歌手uri
void queryLove(String songId);//查询我喜欢的数据库中有没这首歌
void saveToLove(Song song); //添加到我喜欢的表
void deleteFromLove(String songId); //从我喜欢的表中移除
}
interface View{
String getSingerName(); //得到歌手的姓名
void getSingerAndLrc();//按钮点击事件,获取封面和歌词
void setSingerImg(String ImgUrl); //将图片设置成背景
void setImgFail(String errorMessage);
void setSearchImg();//设置搜索歌曲的图片
void showLove(boolean love); //判断是否显示我喜欢的图标
void showLoveAnim(); //喜欢的动画
void saveToLoveSuccess();//保存到我喜欢数据库成功
}
interface Presenter{
void getSingerImg(String singer);
void getSingerImgSuccess(String ImgUrl); //成功获取图片
void getSingerImgFail(); //请求失败
void queryLove(String songId);//查询我喜欢的数据库中有没这首歌
void saveToLove(Song song); //添加到我喜欢的表
void deleteFromLove(String songId); //从我喜欢的表中移除
void saveToLoveSuccess();//保存到我喜欢数据库成功
void showLove(boolean love); //判断是否显示我喜欢的图标
}
}

@ -9,6 +9,7 @@ import org.litepal.crud.LitePalSupport;
public class LocalSong extends LitePalSupport{
private int id;
private String songId;
private String name;
private String singer;
private String url;
@ -63,4 +64,12 @@ public class LocalSong extends LitePalSupport{
public long getDuration() {
return duration;
}
public void setSongId(String songId) {
this.songId = songId;
}
public String getSongId() {
return songId;
}
}

@ -0,0 +1,75 @@
package com.example.musicplayer.entiy;
import org.litepal.crud.LitePalSupport;
/**
* Created by on 2018/11/30.
*/
public class Love extends LitePalSupport{
private int id;
private String songId;
private String name;
private String singer;
private String url;
private String pic;
private boolean isOnline;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSinger() {
return singer;
}
public void setSinger(String singer) {
this.singer = singer;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
public String getSongId() {
return songId;
}
public void setSongId(String songId) {
this.songId = songId;
}
public void setOnline(boolean online) {
isOnline = online;
}
public boolean isOnline() {
return isOnline;
}
}

@ -18,7 +18,7 @@ public class Song implements Serializable {
private int current;//在本地音乐的位置
private String imgUrl;
private boolean isOnline;
private boolean isOnlineAlbum;
private int listType;
public String getImgUrl() {
return imgUrl;
@ -84,12 +84,12 @@ public class Song implements Serializable {
isOnline = online;
}
public boolean isOnlineAlbum() {
return isOnlineAlbum;
public int getListType() {
return listType;
}
public void setOnlineAlbum(boolean onlineAlbum) {
isOnlineAlbum = onlineAlbum;
public void setListType(int listType) {
this.listType = listType;
}
public String getOnlineId() {
@ -103,7 +103,7 @@ public class Song implements Serializable {
public String toString(){
return "songName="+songName+",singer="+singer+",url="+url+",imgUrl="+imgUrl
+",duration="+duration+",currentTime="+currentTime+",current="+current
+",onlineId="+onlineId+",isOnline="+isOnline+",isOnlineAlbum="+isOnlineAlbum;
+",onlineId="+onlineId+",isOnline="+isOnline+",listType="+listType;
}
}

@ -4,10 +4,17 @@ import android.support.annotation.MainThread;
import android.util.Log;
import com.example.musicplayer.contract.IPlayContract;
import com.example.musicplayer.entiy.Love;
import com.example.musicplayer.entiy.SingerImg;
import com.example.musicplayer.entiy.Song;
import com.example.musicplayer.https.NetWork;
import org.litepal.LitePal;
import org.litepal.crud.callback.FindMultiCallback;
import org.litepal.crud.callback.SaveCallback;
import java.io.IOException;
import java.util.List;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
@ -63,4 +70,57 @@ public class IPlayModel implements IPlayContract.Model {
}
});
}
@Override
public void queryLove(final String songId) {
new Thread(new Runnable() {
@Override
public void run() {
LitePal.where("songId=?",songId).findAsync(Love.class).listen(new FindMultiCallback<Love>() {
@Override
public void onFinish(List<Love> list) {
if(list.size()==0){
mPresenter.showLove(false);
}else{
mPresenter.showLove(true);
}
}
});
}
}).start();
}
@Override
public void saveToLove(final Song song) {
new Thread(new Runnable() {
@Override
public void run() {
Love love =new Love();
love.setName(song.getSongName());
love.setSinger(song.getSinger());
love.setUrl(song.getUrl());
love.setPic(song.getImgUrl());
love.setSongId(song.getOnlineId());
love.setOnline(song.isOnline());
love.saveAsync().listen(new SaveCallback() {
@Override
public void onFinish(boolean success) {
if(success){
mPresenter.saveToLoveSuccess();
}
}
});
}
}).start();
}
@Override
public void deleteFromLove(final String songId) {
new Thread(new Runnable() {
@Override
public void run() {
LitePal.deleteAll("songId=?",songId);
}
}).start();
}
}

@ -2,6 +2,7 @@ package com.example.musicplayer.model;
import android.database.Cursor;
import android.provider.MediaStore;
import android.util.Log;
import com.example.musicplayer.constant.MyApplication;
import com.example.musicplayer.contract.ILocalMusicContract;
@ -18,6 +19,7 @@ import java.util.List;
*/
public class LocalMusicModel implements ILocalMusicContract.Model {
private static final String TAG="LocalMusicModel";
private ILocalMusicContract.Presenter mPresenter;
@ -65,6 +67,8 @@ public class LocalMusicModel implements ILocalMusicContract.Model {
mp3Info.setSinger(artist);
mp3Info.setDuration(duration);
mp3Info.setUrl(url);
mp3Info.setSongId(String.valueOf(id));
Log.d(TAG, "run: "+mp3Info.getSongId());
mp3InfoList.add(mp3Info);
}
}
@ -88,6 +92,7 @@ public class LocalMusicModel implements ILocalMusicContract.Model {
song.setSinger(localSong.getSinger());
song.setUrl(localSong.getUrl());
song.setDuration(localSong.getDuration());
song.setSongId(localSong.getSongId());
song.save();
}
}

@ -2,6 +2,7 @@ package com.example.musicplayer.presenter;
import com.example.musicplayer.base.BasePresenter;
import com.example.musicplayer.contract.IPlayContract;
import com.example.musicplayer.entiy.Song;
import com.example.musicplayer.model.IPlayModel;
/**
@ -34,4 +35,33 @@ public class PlayPresenter extends BasePresenter<IPlayContract.View> implements
getMvpView().setImgFail("获取歌手照片失败");
}
}
@Override
public void queryLove(String songId) {
mModel.queryLove(songId);
}
@Override
public void saveToLove(Song song) {
mModel.saveToLove(song);
}
@Override
public void deleteFromLove(String songId) {
mModel.deleteFromLove(songId);
}
@Override
public void saveToLoveSuccess() {
if(isAttachView()){
getMvpView().saveToLoveSuccess();
}
}
@Override
public void showLove(boolean love) {
if(isAttachView()){
getMvpView().showLove(love);
}
}
}

@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.ConnectivityManager;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
@ -11,6 +12,7 @@ import android.util.Log;
import com.example.musicplayer.constant.BroadcastName;
import com.example.musicplayer.constant.Constant;
import com.example.musicplayer.entiy.LocalSong;
import com.example.musicplayer.entiy.Love;
import com.example.musicplayer.entiy.OnlineSong;
import com.example.musicplayer.entiy.Song;
import com.example.musicplayer.util.FileHelper;
@ -28,10 +30,10 @@ public class PlayerService extends Service {
private PlayStatusBinder mPlayStatusBinder = new PlayStatusBinder();
private MediaPlayer mediaPlayer = new MediaPlayer(); //媒体播放器对象
private boolean isPause; //暂停状态
private Song song;
private boolean isPlaying; //是否播放
private List<LocalSong> mLocalSongList;
private List<OnlineSong> mSongList;
private List<Love> mLoveList;
private int mCurrent;
private int mListType;
@ -60,7 +62,7 @@ public class PlayerService extends Service {
} else {
mPlayStatusBinder.stop();
}
} else {
} else if(mListType == Constant.LIST_TYPE_ONLINE){
saveOnlineSongInfo(mCurrent);
if (mCurrent <= mSongList.size()) {
mPlayStatusBinder.play(Constant.LIST_TYPE_ONLINE);
@ -69,8 +71,15 @@ public class PlayerService extends Service {
mPlayStatusBinder.stop();
}
} else {
saveLoveInfo(mCurrent,FileHelper.getSong().isOnline());
if (mCurrent <= mLoveList.size()) {
mPlayStatusBinder.play(Constant.LIST_TYPE_LOVE);
sendBroadcast(new Intent(BroadcastName.LOVE_SONG_CHANGE));//专辑列表的改变
} else {
mPlayStatusBinder.stop();
}
}
sendBroadcast(new Intent(BroadcastName.SONG_CHANGE)); //发送广播改变播放栏的信息
sendBroadcast(new Intent(BroadcastName.ONLINE_SONG_FINISH));//发送网络歌曲播放结束的广播改变网络搜索列表的改变
}
});
@ -90,15 +99,6 @@ public class PlayerService extends Service {
}
public class PlayStatusBinder extends Binder {
//确认播放列表的类型
public void setListType(int listType) {
mListType = listType;
if (mListType == Constant.LIST_TYPE_ONLINE) {
mSongList = LitePal.findAll(OnlineSong.class);
} else if (mListType == Constant.LIST_TYPE_LOCAL) {
mLocalSongList = LitePal.findAll(LocalSong.class);
}
}
/**
@ -115,13 +115,17 @@ public class PlayerService extends Service {
mSongList = LitePal.findAll(OnlineSong.class);
} else if (mListType == Constant.LIST_TYPE_LOCAL) {
mLocalSongList = LitePal.findAll(LocalSong.class);
}else if(mListType == Constant.LIST_TYPE_LOVE){
mLoveList = orderList(LitePal.findAll(Love.class));
}
mCurrent = FileHelper.getSong().getCurrent();
mediaPlayer.reset();//把各项参数恢复到初始状态
if (mListType == Constant.LIST_TYPE_LOCAL) {
mediaPlayer.setDataSource(mLocalSongList.get(mCurrent).getUrl());
} else {
} else if(mListType == Constant.LIST_TYPE_ONLINE){
mediaPlayer.setDataSource(mSongList.get(mCurrent).getUrl());
} else{
mediaPlayer.setDataSource(mLoveList.get(mCurrent).getUrl());
}
mediaPlayer.prepare(); //进行缓冲
isPlaying = true;
@ -185,16 +189,21 @@ public class PlayerService extends Service {
saveLocalSongInfo(mCurrent);
mPlayStatusBinder.play(Constant.LIST_TYPE_LOCAL);
sendBroadcast(new Intent(BroadcastName.LOCAL_SONG_CHANGE_LIST));//发送广播改变当地列表的显示
} else {
} else if(mListType == Constant.LIST_TYPE_ONLINE){
if (mCurrent >= mSongList.size()) {
mCurrent = 0;
}
saveOnlineSongInfo(mCurrent);
mPlayStatusBinder.play(Constant.LIST_TYPE_ONLINE);
sendBroadcast(new Intent(BroadcastName.ONLINE_ALBUM_SONG_Change));//专辑列表的改变
} else{
if (mCurrent >= mLoveList.size()) {
mCurrent = 0;
}
saveLoveInfo(mCurrent,FileHelper.getSong().isOnline());
mPlayStatusBinder.play(Constant.LIST_TYPE_LOVE);
sendBroadcast(new Intent(BroadcastName.LOVE_SONG_CHANGE));
}
sendBroadcast(new Intent(BroadcastName.SONG_CHANGE)); //发送广播改变播放栏的信息
sendBroadcast(new Intent(BroadcastName.ONLINE_SONG_FINISH));//发送网络歌曲播放结束的广播改变网络搜索列表的改变
}
@ -202,18 +211,27 @@ public class PlayerService extends Service {
mCurrent = FileHelper.getSong().getCurrent();
mCurrent--;
if (mCurrent == -1) {
mCurrent = mListType == Constant.LIST_TYPE_LOCAL ? mLocalSongList.size() - 1 : mSongList.size() - 1;
if(mListType == Constant.LIST_TYPE_LOCAL){
mCurrent = mLocalSongList.size()-1;
}else if(mListType ==Constant.LIST_TYPE_ONLINE){
mCurrent =mSongList.size()-1;
}else {
mCurrent = mLoveList.size()-1;
}
}
if (mListType == Constant.LIST_TYPE_LOCAL) {
saveLocalSongInfo(mCurrent);
mPlayStatusBinder.play(Constant.LIST_TYPE_LOCAL);
mPlayStatusBinder.play(mListType);
sendBroadcast(new Intent(BroadcastName.LOCAL_SONG_CHANGE_LIST));//发送广播改变当地列表的显示
} else {
} else if(mListType == Constant.LIST_TYPE_ONLINE){
saveOnlineSongInfo(mCurrent);
mPlayStatusBinder.play(Constant.LIST_TYPE_ONLINE);
mPlayStatusBinder.play(mListType);
sendBroadcast(new Intent(BroadcastName.ONLINE_ALBUM_SONG_Change));//专辑列表的改变
} else{
saveLoveInfo(mCurrent,FileHelper.getSong().isOnline());
mPlayStatusBinder.play(mListType);
sendBroadcast(new Intent(BroadcastName.LOVE_SONG_CHANGE));
}
sendBroadcast(new Intent(BroadcastName.SONG_CHANGE)); //发送广播改变播放栏的信息
sendBroadcast(new Intent(BroadcastName.ONLINE_SONG_FINISH));//发送网络歌曲播放结束的广播改变网络搜索列表的改变
}
@ -296,7 +314,7 @@ public class PlayerService extends Service {
song.setDuration(localSong.getDuration());
song.setUrl(localSong.getUrl());
song.setOnline(false);
song.setOnlineAlbum(false);
song.setListType(Constant.LIST_TYPE_LOCAL);
FileHelper.saveSong(song);
}
@ -311,9 +329,30 @@ public class PlayerService extends Service {
song.setUrl(mSongList.get(current).getUrl());
song.setImgUrl(mSongList.get(current).getPic());
song.setOnline(true);
song.setOnlineAlbum(true);
song.setListType(Constant.LIST_TYPE_ONLINE);
FileHelper.saveSong(song);
}
private void saveLoveInfo(int current,boolean isOnline){
mLoveList = orderList(LitePal.findAll(Love.class));
Love love = mLoveList.get(current);
Song song = new Song();
song.setCurrent(current);
song.setOnlineId(love.getSongId());
song.setSongName(love.getName());
song.setSinger(love.getSinger());
song.setUrl(love.getUrl());
song.setImgUrl(love.getPic());
song.setListType(Constant.LIST_TYPE_LOVE);
song.setOnline(isOnline);
}
private List<Love> orderList(List<Love> tempList){
List<Love> loveList=new ArrayList<>();
loveList.clear();
for(int i=tempList.size()-1;i>=0;i--){
loveList.add(tempList.get(i));
}
return loveList;
}
}

@ -167,7 +167,7 @@ public class AlbumSongFragment extends Fragment implements IAlbumSongContract.Vi
song.setImgUrl(dataBean.getPic());
song.setCurrent(position);
song.setOnline(true);
song.setOnlineAlbum(true);
song.setListType(Constant.LIST_TYPE_ONLINE);
FileHelper.saveSong(song);
mPlayStatusBinder.play(Constant.LIST_TYPE_ONLINE);

@ -0,0 +1,145 @@
package com.example.musicplayer.view;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import com.example.musicplayer.R;
import com.example.musicplayer.adapter.LoveSongAdapter;
import com.example.musicplayer.adapter.SongAdapter;
import com.example.musicplayer.constant.BroadcastName;
import com.example.musicplayer.constant.Constant;
import com.example.musicplayer.entiy.LocalSong;
import com.example.musicplayer.entiy.Love;
import com.example.musicplayer.entiy.Song;
import com.example.musicplayer.service.PlayerService;
import com.example.musicplayer.util.FileHelper;
import org.litepal.LitePal;
import java.util.ArrayList;
import java.util.List;
/**
* Created by on 2018/11/30.
*/
public class CollectionFragment extends Fragment {
private RecyclerView mRecycler;
private ImageView mBackIv;
private LinearLayoutManager mManager;
private LoveSongAdapter mAdapter;
private LinearLayout mSongListLinear;
private RelativeLayout mEmptyRelative;
private List<Love> mLoveList;
private List<Love> mTempList;
//注册广播
private IntentFilter intentFilter;
private SongChangeReceiver songChangeReceiver;
private PlayerService.PlayStatusBinder mPlayStatusBinder;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mPlayStatusBinder = (PlayerService.PlayStatusBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View mView = inflater.inflate(R.layout.fragment_love_music, container, false);
mRecycler = mView.findViewById(R.id.recycler_love_songs);
mBackIv = mView.findViewById(R.id.iv_back);
mEmptyRelative = mView.findViewById(R.id.relative_empty);
mSongListLinear = mView.findViewById(R.id.linear_song_list);
mTempList =new ArrayList<>();
mLoveList = new ArrayList<>();
return mView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
//启动服务
Intent playIntent = new Intent(getActivity(), PlayerService.class);
getActivity().bindService(playIntent, connection, Context.BIND_AUTO_CREATE);
//注册广播
intentFilter=new IntentFilter();
intentFilter.addAction(BroadcastName.LOVE_SONG_CHANGE);
songChangeReceiver=new SongChangeReceiver();
getActivity().registerReceiver(songChangeReceiver,intentFilter);
showSongList();
onClick();
}
private void showSongList(){
mLoveList.clear();
mTempList = LitePal.findAll(Love.class);
if(mTempList.size()==0){
mEmptyRelative.setVisibility(View.VISIBLE);
mSongListLinear.setVisibility(View.GONE);
}else{
mEmptyRelative.setVisibility(View.GONE);
mSongListLinear.setVisibility(View.VISIBLE);
}
//对数据库的数据倒序显示
for(int i=mTempList.size()-1;i>=0;i--){
mLoveList.add(mTempList.get(i));
}
mAdapter = new LoveSongAdapter(getActivity(),mLoveList);
mManager = new LinearLayoutManager(getActivity());
mRecycler.setLayoutManager(mManager);
mRecycler.setAdapter(mAdapter);
}
private void onClick(){
mAdapter.setOnItemClickListener(new LoveSongAdapter.OnItemClickListener() {
@Override
public void onSongClick(int position) {
Love love = mLoveList.get(position);
Song song =new Song();
song.setOnlineId(love.getSongId());
song.setSongName(love.getName());
song.setSinger(love.getSinger());
song.setOnline(love.isOnline());
song.setUrl(love.getUrl());
song.setImgUrl(love.getPic());
song.setCurrent(position);
song.setListType(Constant.LIST_TYPE_LOVE);
FileHelper.saveSong(song);
mPlayStatusBinder.play(Constant.LIST_TYPE_LOVE);
}
});
}
private class SongChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
mAdapter.notifyDataSetChanged();
if(FileHelper.getSong()!=null) {
mManager.scrollToPositionWithOffset(FileHelper.getSong().getCurrent()+4, mRecycler.getHeight());
}
}
}
}

@ -55,9 +55,6 @@ public class LocalMusicFragment extends Fragment implements ILocalMusicContract.
private ImageView mBackIv;
private ViewStub mEmptyViewStub;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {

@ -90,6 +90,7 @@ public class MainActivity extends AppCompatActivity {
intentFilter.addAction(BroadcastName.ONLINE_ALBUM_SONG_Change);
songChangeReceiver = new SongChangeReceiver();
registerReceiver(songChangeReceiver, intentFilter);
LitePal.getDatabase();
initView();
onClick();
@ -196,10 +197,8 @@ public class MainActivity extends AppCompatActivity {
} else {
if (FileHelper.getSong().isOnline()) {
mPlayStatusBinder.playOnline();
} else if(FileHelper.getSong().isOnlineAlbum()){
mPlayStatusBinder.play(Constant.LIST_TYPE_ONLINE);
}else{
mPlayStatusBinder.play(Constant.LIST_TYPE_LOCAL);
} else{
mPlayStatusBinder.play(FileHelper.getSong().getListType());
}
mMediaPlayer.seekTo((int) mSong.getCurrentTime());
mCircleAnimator.start();

@ -19,9 +19,14 @@ import android.widget.TextView;
import com.example.musicplayer.R;
import com.example.musicplayer.adapter.ExpandableListViewAdapter;
import com.example.musicplayer.entiy.History;
import com.example.musicplayer.entiy.LocalSong;
import com.example.musicplayer.entiy.Love;
import com.example.musicplayer.util.CommonUtil;
import com.example.musicplayer.widget.MyListView;
import org.litepal.LitePal;
/**
* A simple {@link Fragment} subclass.
*/
@ -30,11 +35,10 @@ public class MainFragment extends Fragment {
private LinearLayout mFunctionLinear;
private MyListView myListView;
private LocalMusicFragment mLocalMusicFragment;
private SearchFragment mSearchFragment;
private ExpandableListAdapter mAdapter;
private LinearLayout mLocalMusicLinear;
private LinearLayout mLocalMusicLinear,mCollectionLinear;
private Button playerBtn;
private TextView mLocalMusicNum,mLoveMusicNum,mHistoryMusicNum;
private TextView mSeekBtn;
private String[] mGroupStrings = {"自建歌单", "收藏歌单"};
@ -49,12 +53,16 @@ public class MainFragment extends Fragment {
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
mLocalMusicLinear = view.findViewById(R.id.linear_local_music);
mCollectionLinear = view.findViewById(R.id.linear_collection);
playerBtn = view.findViewById(R.id.btn_player);
mFunctionLinear = view.findViewById(R.id.linear_function);
//获取焦点
mFunctionLinear.setFocusableInTouchMode(true);
myListView = view.findViewById(R.id.expand_lv_song_list);
mSeekBtn = view.findViewById(R.id.tv_seek);
mLocalMusicNum = view.findViewById(R.id.tv_local_music_num);
mLoveMusicNum = view.findViewById(R.id.tv_love_num);
mHistoryMusicNum = view.findViewById(R.id.tv_history_num);
return view;
}
@ -65,13 +73,12 @@ public class MainFragment extends Fragment {
mAdapter = new ExpandableListViewAdapter(getActivity(), mGroupStrings, mSongStrings);
myListView.setAdapter(mAdapter);
onClick();
}
@Override
public void onResume(){
super.onResume();
CommonUtil.hideStatusBar(getActivity(),true);
showMusicNum();
Log.d(TAG, "onResume: true");
}
@ -79,37 +86,41 @@ public class MainFragment extends Fragment {
mLocalMusicLinear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
replaceFragment(1);
replaceFragment(new LocalMusicFragment());
}
});
mSeekBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
replaceFragment(2);
replaceFragment(new SearchFragment());
}
});
mCollectionLinear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
replaceFragment(new CollectionFragment());
}
});
}
private void replaceFragment(int type) {
private void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
//进入和退出动画
transaction.setCustomAnimations(R.anim.fragment_in, R.anim.fragment_out, R.anim.slide_in_right, R.anim.slide_out_right);
if (type == 1) {
mLocalMusicFragment = new LocalMusicFragment();
transaction.add(R.id.fragment_container, mLocalMusicFragment);
} else if (type ==2) {
mSearchFragment = new SearchFragment();
transaction.add(R.id.fragment_container,mSearchFragment);
}
transaction.add(R.id.fragment_container, fragment);
transaction.hide(this);
//将事务提交到返回栈
transaction.addToBackStack(null);
transaction.commit();
}
private void showMusicNum(){
mLoveMusicNum.setText(""+LitePal.findAll(LocalSong.class).size());
mLoveMusicNum.setText(""+LitePal.findAll(Love.class).size());
}
}

@ -1,5 +1,7 @@
package com.example.musicplayer.view;
import android.animation.AnimatorInflater;
import android.animation.AnimatorSet;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@ -66,7 +68,7 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View {
private String TAG = "PlayActivity";
private boolean isOnline; //判断是否为网络歌曲
private boolean isOnlineAlbum;//判断是否为网络专辑
private int mListType; //列表类型
private int mPlayStatus;
private boolean isChange; //拖动进度条
@ -90,6 +92,9 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View {
private TextView mDurationTimeTv;
private Button mLoveBtn;
private boolean isLove;//是否已经在我喜欢的列表中
private DiscView mDisc; //唱碟
private ImageView mDiscImg; //唱碟中的歌手头像
private Bitmap mImgBmp;
@ -107,7 +112,6 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View {
public void onServiceConnected(ComponentName name, IBinder service) {
mPlayStatusBinder = (PlayerService.PlayStatusBinder) service;
isOnline = FileHelper.getSong().isOnline();
isOnlineAlbum = FileHelper.getSong().isOnlineAlbum();
if (isOnline) {
mGetImgAndLrcBtn.setVisibility(View.GONE);
mDurationTimeTv.setText(MediaUtil.formatTime(FileHelper.getSong().getDuration()));
@ -156,6 +160,7 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View {
//与Presenter建立关系
mPresenter = new PlayPresenter();
mPresenter.attachView(this);
//是否为网络歌曲
@ -185,15 +190,19 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View {
mDisc = findViewById(R.id.disc_view);
mDiscImg = findViewById(R.id.iv_disc_background);
mLoveBtn = findViewById(R.id.btn_love);
//界面填充
mSong = FileHelper.getSong();
mListType = mSong.getListType();
mSingerTv.setText(mSong.getSinger());
mSongTv.setText(mSong.getSongName());
mCurrentTimeTv.setText(MediaUtil.formatTime(mSong.getCurrentTime()));
mSeekBar.setMax((int) mSong.getDuration());
mSeekBar.setProgress((int) mSong.getCurrentTime());
mPresenter.queryLove(mSong.getOnlineId()); //查找歌曲是否为我喜欢的歌曲
if (mPlayStatus == PlayerStatus.PLAY) {
mDisc.play();
@ -205,7 +214,6 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View {
Intent playIntent = new Intent(PlayActivity.this, PlayerService.class);
bindService(playIntent, connection, Context.BIND_AUTO_CREATE);
}
private void try2UpdateMusicPicBackground(final Bitmap bitmap) {
@ -315,10 +323,8 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View {
Log.d(TAG, "onClick: --------play");
if (isOnline) {
mPlayStatusBinder.playOnline();
} else if (isOnlineAlbum) {
mPlayStatusBinder.play(Constant.LIST_TYPE_ONLINE);
} else {
mPlayStatusBinder.play(Constant.LIST_TYPE_LOCAL);
mPlayStatusBinder.play(mListType);
}
mMediaPlayer.seekTo((int) mSong.getCurrentTime());
mDisc.play();
@ -347,6 +353,21 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View {
mDisc.last();
}
});
mLoveBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showLoveAnim();
if(isLove){
mLoveBtn.setSelected(false);
mPresenter.deleteFromLove(FileHelper.getSong().getOnlineId());
}else {
mLoveBtn.setSelected(true);
mPresenter.saveToLove(FileHelper.getSong());
}
}
});
}
@Override
@ -379,12 +400,11 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View {
//保存图片到本地
FileHelper.saveImgToNative(PlayActivity.this, mImgBmp, getSingerName());
CommonUtil.showToast(PlayActivity.this, "获取封面歌词成功");
// //将封面地址放到数据库中
// LocalSong localSong =new LocalSong();
// mLocalSong = LitePal.findAll(LocalSong.class);
// localSong.setPic(BaseUri.STORAGE_IMG_FILE + FileHelper.getSong().getSinger() + ".jpg");
// localSong.updateAll("singer",FileHelper.getSong().getSinger());
//将封面地址放到数据库中
LocalSong localSong =new LocalSong();
mLocalSong = LitePal.findAll(LocalSong.class);
localSong.setPic(BaseUri.STORAGE_IMG_FILE + FileHelper.getSong().getSinger() + ".jpg");
localSong.updateAll("singer",FileHelper.getSong().getSinger());
}
try2UpdateMusicPicBackground(mImgBmp);
@ -406,8 +426,32 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View {
}
@Override
public void setSearchImg() {
public void showLove(final boolean love) {
isLove =love;
runOnUiThread(new Runnable() {
@Override
public void run() {
if(love){
mLoveBtn.setSelected(true);
}else{
mLoveBtn.setSelected(false);
}
}
});
}
@Override
public void showLoveAnim() {
mLoveBtn.setSelected(true);
AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(PlayActivity.this, R.animator.favorites_anim);
animatorSet.setTarget(mLoveBtn);
animatorSet.start();
}
@Override
public void saveToLoveSuccess() {
CommonUtil.showToast(PlayActivity.this,"添加成功");
}
@ -427,7 +471,6 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Song mSong = FileHelper.getSong();
mSongTv.setText(mSong.getSongName());
mSingerTv.setText(mSong.getSinger());
@ -435,7 +478,7 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View {
mPlayBtn.setSelected(true);
mSeekBar.setMax((int) mSong.getDuration());
startUpdateSeekBarProgress();
if (action.equals(BroadcastName.ONLINE_ALBUM_SONG_Change) || action.equals(BroadcastName.ONLINE_SONG)) {
if (mSong.isOnline()) {
setSingerImg(mSong.getImgUrl());
} else {
setLocalImg(mSong.getSinger());//显示照片

@ -11,6 +11,7 @@ import android.view.ViewGroup;
import com.example.musicplayer.R;
import com.example.musicplayer.adapter.SearchHistoryAdapter;
import com.example.musicplayer.entiy.History;
import com.example.musicplayer.widget.DeleteDialog;
import org.litepal.LitePal;
@ -56,14 +57,34 @@ public class SearchHistoryFragment extends Fragment {
mAdapter.setFooterClickListener(new SearchHistoryAdapter.OnFooterClickListener() {
@Override
public void onClick() {
LitePal.deleteAll(History.class);
mRecycler.setVisibility(View.GONE);
final DeleteDialog dialog = new DeleteDialog(getActivity());
dialog.setOnClickListener(new DeleteDialog.OnClickListener() {
@Override
public void selectCancel() {
dialog.dismiss();
}
@Override
public void selectDelete() {
//删除数据库中的历史记录
LitePal.deleteAll(History.class);
mRecycler.setVisibility(View.GONE);
dialog.dismiss();
}
@Override
public String setTitle() {
return "确定清空搜索历史?";
}
});
dialog.show();
}
});
mAdapter.setOnDeleteClickListener(new SearchHistoryAdapter.OnDeleteClickListener() {
@Override
public void onClick(int position) {
History history =mTempList.get(position);
History history =mHistoryList.get(position);
LitePal.deleteAll(History.class,"history = ?",history.getHistory());
mTempList =LitePal.findAll(History.class);
changeList();

@ -0,0 +1,84 @@
package com.example.musicplayer.widget;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Context;
import android.support.annotation.NonNull;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
import com.example.musicplayer.R;
public class DeleteDialog extends Dialog implements View.OnClickListener{
private OnClickListener mOnClickListener;
private TextView mTitle;
public interface OnClickListener {
void selectCancel(); //选择取消
void selectDelete(); //选择删除
String setTitle();
}
public void setOnClickListener(OnClickListener onClickListener) {
mOnClickListener = onClickListener;
}
public DeleteDialog(@NonNull Context context) {
super(context, R.style.MyDialog);
initView();
}
private void initView() {
@SuppressLint("InflateParams") View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_delete_photo, null);
mTitle = view.findViewById(R.id.tv_dialog_delete_title); //标题
TextView cancel = view.findViewById(R.id.tv_dialog_delete_photo_cancel); //取消
cancel.setOnClickListener(this);
TextView delete = view.findViewById(R.id.tv_dialog_delete_photo_delete); //删除
delete.setOnClickListener(this);
super.setContentView(view); //设置布局
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv_dialog_delete_photo_cancel: //取消
mOnClickListener.selectCancel(); //回调给主活动,让主活动处理相关逻辑,下同
break;
case R.id.tv_dialog_delete_photo_delete: //删除
mOnClickListener.selectDelete();
break;
default:
break;
}
}
/**
* 使dialog
*/
@Override
public void show() {
super.show();
Window dialogWindow = this.getWindow();
assert dialogWindow != null;
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
//获取屏幕宽度
DisplayMetrics dm = new DisplayMetrics();
WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
assert wm != null;
wm.getDefaultDisplay().getMetrics(dm);
int screenWidth = dm.widthPixels;
//设置高宽
lp.width = (int) (screenWidth * 0.9); // 宽度
lp.height = (int) (lp.width * 0.4); // 高度
dialogWindow.setAttributes(lp);
mTitle.setText(mOnClickListener.setTitle()); //设置标题
}
}

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">
<objectAnimator
android:propertyName="scaleX"
android:valueFrom="1.5"
android:valueTo="1.0"
android:valueType="floatType"/>
<objectAnimator
android:propertyName="scaleY"
android:valueFrom="1.5"
android:valueTo="1.0"
android:valueType="floatType"/>
</set>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/player"/>
<corners android:radius="10dp"/>
</shape>

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/favorites_selected"/>
<item android:drawable="@drawable/favorites"/>
</selector>

@ -161,6 +161,16 @@
android:layout_height="60dp"
android:background="@drawable/activity_play_next" />
</LinearLayout>
<Button
android:id="@+id/btn_love"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_centerVertical="true"
android:layout_alignParentEnd="true"
android:layout_marginEnd="20dp"
android:background="@drawable/love" />
</RelativeLayout>
</com.example.musicplayer.widget.BackgroundAnimationRelativeLayout>

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/dialog_bg">
<TextView
android:id="@+id/tv_dialog_delete_title"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:text="确定删除这张照片?"
android:textColor="@color/white_blue"
android:textSize="14sp"
android:layout_gravity="center"
android:gravity="center"
/>
<View
android:layout_width="match_parent"
android:layout_height="0.3dp"
android:background="@color/gray"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
>
<TextView
android:id="@+id/tv_dialog_delete_photo_cancel"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/cancel"
android:clickable="true"
android:textSize="16sp"
android:textColor="@color/white_blue"
android:layout_gravity="center"
android:gravity="center"/>
<View
android:layout_width="0.3dp"
android:layout_height="match_parent"
android:background="@color/gray"/>
<TextView
android:id="@+id/tv_dialog_delete_photo_delete"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/sure"
android:clickable="true"
android:textSize="16sp"
android:textColor="@color/yellow"
android:layout_gravity="center"
android:gravity="center"/>
</LinearLayout>
</LinearLayout>

@ -23,6 +23,7 @@
android:src="@drawable/back" />
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"

@ -0,0 +1,86 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="20dp"
android:background="@color/actionBarColor" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@color/actionBarColor">
<ImageView
android:id="@+id/iv_back"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_centerVertical="true"
android:layout_marginStart="10dp"
android:src="@drawable/back" />
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="5dp"
android:layout_toRightOf="@id/iv_back"
android:text="@string/collection"
android:textColor="@color/white"
android:textSize="16sp" />
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="20dp"
android:background="@color/seekColor">
</View>
<LinearLayout
android:id="@+id/linear_song_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/translucent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_love_songs"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="65dp">
</android.support.v7.widget.RecyclerView>
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="65dp"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/relative_empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/translucent">
<ImageView
android:id="@+id/iv_empty"
android:layout_width="120dp"
android:layout_height="120dp"
android:src="@drawable/empty_song"
android:scaleType="centerCrop"
android:layout_centerInParent="true"/>
<TextView
android:layout_marginTop="20dp"
android:layout_below="@+id/iv_empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="@color/white_blue"
android:text="收藏列表为空,赶紧去收藏自己喜欢的歌吧"
android:layout_centerHorizontal="true"
/>
</RelativeLayout>
</LinearLayout>

@ -7,7 +7,7 @@
<View
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_height="35dp"
android:background="@color/tab"/>

@ -39,6 +39,7 @@
android:textColor="@drawable/selector_linear_click"
/>
<TextView
android:id="@+id/tv_local_music_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
@ -46,6 +47,7 @@
android:textColor="@drawable/selector_linear_click"/>
</LinearLayout>
<LinearLayout
android:id="@+id/linear_collection"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
@ -67,6 +69,7 @@
android:text="@string/collection"
android:textColor="@drawable/selector_linear_click"/>
<TextView
android:id="@+id/tv_love_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
@ -99,7 +102,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="150"
android:text="0"
android:textColor="@drawable/selector_linear_click"/>
</LinearLayout>
<LinearLayout
@ -125,6 +128,7 @@
android:text="@string/history"
android:textColor="@drawable/selector_linear_click"/>
<TextView
android:id="@+id/tv_history_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"

@ -28,8 +28,8 @@
<ImageView
android:id="@+id/iv_history_delete"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_width="23dp"
android:layout_height="23dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="20dp"

@ -11,6 +11,8 @@
<string name="welcome">人生几何,对酒当歌</string>
<string name="search">搜索</string>
<string name="delete_all_history">清空搜索历史</string>
<string name="cancel">取消</string>
<string name="sure">确定</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>

@ -42,7 +42,13 @@
<item name="android:layout_height">wrap_content</item>
<item name="android:thumb">@drawable/ic_seekbar_thumb</item>
</style>
<style name="MyDialog" parent="android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item> <!-- 没有标题-->
<item name="android:windowBackground">@android:color/transparent</item> <!-- 背景颜色 -->
<item name="android:windowFrame">@null</item> <!-- 没有边框 -->
<item name="android:windowIsFloating">true</item> <!-- 窗口浮动 -->
<item name="android:windowContentOverlay">@null</item> <!-- 没有阴影 -->
</style>

Loading…
Cancel
Save