Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
R
RvApp
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lify
RvApp
Commits
3fb7cf3c
Commit
3fb7cf3c
authored
Nov 11, 2019
by
linfeng
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
音乐功能
parent
ce264934
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
180 additions
and
252 deletions
+180
-252
SelectMusicActivity.java
...ain/java/com/xxrv/video/activity/SelectMusicActivity.java
+107
-251
SelectMusicAdapter.java
.../main/java/com/xxrv/video/adapter/SelectMusicAdapter.java
+45
-0
MusicInfoBean.java
...c/main/java/com/xxrv/video/bean/circle/MusicInfoBean.java
+27
-0
item_trill_music.xml
plugin_video/src/main/res/layout/item_trill_music.xml
+1
-1
No files found.
plugin_video/src/main/java/com/xxrv/video/activity/SelectMusicActivity.java
View file @
3fb7cf3c
...
...
@@ -19,22 +19,27 @@ import android.widget.LinearLayout;
import
android.widget.TextView
;
import
android.widget.Toast
;
import
com.chad.library.adapter.base.BaseQuickAdapter
;
import
com.frame.base.FrameApp
;
import
com.frame.rv.config.RvFrameConfig
;
import
com.ruiwenliu.wrapper.base.BaseBean
;
import
com.ruiwenliu.wrapper.base.BaseStatusActivity
;
import
com.ruiwenliu.wrapper.util.glide.GlideApp
;
import
com.ruiwenliu.wrapper.weight.TitleView
;
import
com.xxfc.imcamera.utile.FileUtils
;
import
com.xxrv.video.R
;
import
com.xxrv.video.R2
;
import
com.xxrv.video.adapter.DiscoveryVideoSelectAdapter
;
import
com.xxrv.video.adapter.SelectMusicAdapter
;
import
com.xxrv.video.api.VideoApi
;
import
com.xxrv.video.audio_x.VoiceManager
;
import
com.xxrv.video.base.BaseRecAdapter
;
import
com.xxrv.video.base.BaseRecViewHolder
;
import
com.xxrv.video.bean.circle.MusicInfo
;
import
com.xxrv.video.bean.circle.MusicInfoBean
;
import
com.xxrv.video.bean.circle.VideoIMTokenBean
;
import
com.xxrv.video.dialog.SelectMusicDialog
;
import
com.xxrv.video.presenter.VideoPresenter
;
import
com.xxrv.video.util.FileUtils
;
import
com.xxrv.video.util.ScreenUtil
;
import
com.xxrv.video.util.downloader.DownloadListener
;
import
com.xxrv.video.util.downloader.Downloader
;
...
...
@@ -42,6 +47,7 @@ import com.xxrv.video.util.downloader.FailReason;
import
com.yuyife.okgo.OkGoUtil
;
import
java.io.File
;
import
java.util.ArrayList
;
import
java.util.LinkedHashMap
;
import
java.util.List
;
import
java.util.Map
;
...
...
@@ -66,41 +72,20 @@ public class SelectMusicActivity extends BaseStatusActivity<VideoPresenter> impl
LinearLayoutManager
mLayoutManager
;
private
Context
mContext
;
private
SelectMusicDialog
.
OnMusicItemClick
mListener
;
private
List
<
MusicInfo
>
mdatas
;
private
List
<
MusicInfo
>
searchDatas
;
private
CommAvatarAdapter
mAdapter
;
private
List
<
MusicInfo
>
mdatas
=
new
ArrayList
<>()
;
private
List
<
MusicInfo
>
searchDatas
=
new
ArrayList
<>()
;
//
private CommAvatarAdapter mAdapter;
private
int
mPagerIndex
;
private
boolean
isLoad
;
private
int
mCurrPlay
=
-
1
;
// 当前选择的索引
private
MusicInfo
mCurrMusic
;
private
boolean
more
=
true
;
// 是否可加载更多
private
Timer
SEARCH_TIMER
;
private
SearchTimerTask
mSearchTask
;
private
boolean
isSearch
;
// 是否正在搜索
private
VideoIMTokenBean
intokenBean
;
TextWatcher
changeListener
=
new
TextWatcher
()
{
@Override
public
void
beforeTextChanged
(
CharSequence
s
,
int
start
,
int
count
,
int
after
)
{
}
@Override
public
void
onTextChanged
(
CharSequence
s
,
int
start
,
int
before
,
int
count
)
{
}
private
SelectMusicAdapter
adapter
;
@Override
public
void
afterTextChanged
(
Editable
s
)
{
if
(
s
.
length
()
>
0
)
{
mAdapter
.
setNewData
(
null
);
startSearchTimer
(
s
.
toString
());
}
else
{
cancelSearchTimer
();
mAdapter
.
setNewData
(
mdatas
);
hint
.
setVisibility
(
View
.
GONE
);
more
=
true
;
}
}
};
public
static
Intent
getIntent
(
Context
context
)
{
return
new
Intent
(
context
,
SelectMusicActivity
.
class
);
...
...
@@ -114,14 +99,26 @@ public class SelectMusicActivity extends BaseStatusActivity<VideoPresenter> impl
@Override
protected
void
initView
(
Bundle
savedInstanceState
,
TitleView
titleView
,
Intent
intent
)
{
titleView
.
setTitle
(
"选择音乐"
);
mEditText
.
addTextChangedListener
(
changeListener
);
mLayoutManager
=
new
LinearLayoutManager
(
mContext
);
mListView
.
setLayoutManager
(
mLayoutManager
);
mAdapter
=
new
CommAvatarAdapter
(
mdatas
);
mListView
.
setAdapter
(
mA
dapter
);
adapter
=
new
SelectMusicAdapter
(
);
mListView
.
setAdapter
(
a
dapter
);
addListener
();
adapter
.
setOnItemChildClickListener
(
new
BaseQuickAdapter
.
OnItemChildClickListener
()
{
@Override
public
void
onItemChildClick
(
BaseQuickAdapter
adapter
,
View
view
,
int
position
)
{
int
id
=
view
.
getId
();
if
(
id
==
R
.
id
.
rl_content
)
{
playMusic
(
position
);
}
else
if
(
id
==
R
.
id
.
ll_next
)
{
}
}
});
}
@Override
...
...
@@ -135,68 +132,6 @@ public class SelectMusicActivity extends BaseStatusActivity<VideoPresenter> impl
}
private
void
playMusic
(
int
position
)
{
if
(!
isSearch
&&
mCurrPlay
==
position
)
{
return
;
}
VoiceManager
.
instance
().
stop
();
List
<
MusicInfo
>
data
=
isSearch
?
searchDatas
:
mdatas
;
if
(
mCurrPlay
>
-
1
&&
data
.
size
()
>
mCurrPlay
)
{
data
.
get
(
mCurrPlay
).
state
=
0
;
mAdapter
.
notifyItemChanged
(
mCurrPlay
);
}
mCurrPlay
=
position
;
mCurrMusic
=
data
.
get
(
position
);
MusicInfo
info
=
data
.
get
(
position
);
// 去下载路径找
Downloader
.
getInstance
().
init
(
FileUtils
.
mFilesDir
);
File
file
=
Downloader
.
getInstance
().
getFile
(
info
.
getPath
());
Log
.
e
(
"xuan"
,
"down : "
+
info
.
getPath
());
if
(
file
.
exists
())
{
data
.
get
(
mCurrPlay
).
state
=
1
;
mAdapter
.
notifyItemChanged
(
mCurrPlay
);
VoiceManager
.
instance
().
play
(
file
);
}
else
{
data
.
get
(
mCurrPlay
).
state
=
2
;
mAdapter
.
notifyItemChanged
(
mCurrPlay
);
Downloader
.
getInstance
().
addDownload
(
info
.
getPath
(),
new
DownloadListener
()
{
@Override
public
void
onStarted
(
String
uri
,
View
view
)
{
Log
.
e
(
"xuan"
,
"开始下载"
);
}
@Override
public
void
onFailed
(
String
uri
,
FailReason
failReason
,
View
view
)
{
Log
.
e
(
"xuan"
,
"onFailed: 下载失败"
+
mCurrMusic
.
getPath
());
Toast
.
makeText
(
mContext
,
mContext
.
getString
(
R
.
string
.
tip_file_download_failed
),
Toast
.
LENGTH_SHORT
).
show
();
}
@Override
public
void
onComplete
(
String
uri
,
String
filePath
,
View
view
)
{
Log
.
e
(
"xuan"
,
"comp: "
+
filePath
);
if
(
Downloader
.
getInstance
().
getFile
(
mCurrMusic
.
getPath
()).
getAbsolutePath
().
equals
(
filePath
))
{
mCurrMusic
.
setPath
(
filePath
);
VoiceManager
.
instance
().
play
(
filePath
);
data
.
get
(
mCurrPlay
).
state
=
1
;
mAdapter
.
notifyItemChanged
(
mCurrPlay
);
}
}
@Override
public
void
onCancelled
(
String
uri
,
View
view
)
{
Log
.
e
(
"xuan"
,
"取消下载"
);
}
});
}
}
private
void
upData
()
{
if
(
OkGoUtil
.
getToken
()
!=
null
)
{
Map
<
String
,
Object
>
headMap
=
new
LinkedHashMap
<>();
...
...
@@ -206,61 +141,6 @@ public class SelectMusicActivity extends BaseStatusActivity<VideoPresenter> impl
}
private
void
findMusicDataList
(
int
index
,
String
keyword
)
{
Log
.
e
(
"xuan"
,
"findMusicDataList: 加载数据"
+
index
);
isLoad
=
true
;
// Map<String, String> params = new HashMap<>();
// params.put("access_token", mToken);
// params.put("pageIndex", String.valueOf(index));
// params.put("pageSize", String.valueOf(20));
// if (!TextUtils.isEmpty(keyword)) {
// params.put("keyword", keyword);
// }
// HttpUtils.get().url(musicListUrl)
// .params(params)
// .build()
// .execute(new ListCallback<MusicInfo>(MusicInfo.class) {
// @Override
// public void onResponse(ArrayResult<MusicInfo> result) {
// List<MusicInfo> data = result.getData();
// if (data.size() > 0) {
//
// for (int i = 0; i < data.size(); i++) {
// MusicInfo info = data.get(i);
// info.appendDown(mDown);
// }
//
// if (isSearch) {
// searchDatas.addAll(data);
//
// mAdapter.setNewData(searchDatas);
// } else {
// mdatas.addAll(data);
// mAdapter.setNewData(mdatas);
// }
//
// if (data.size() < 20) {
// more = false;
// }
// hint.setVisibility(View.GONE);
// } else {
// more = false;
// hint.setVisibility(View.VISIBLE);
// }
// isLoad = false;
// }
//
// @Override
// public void onError(Call call, Exception e) {
// isLoad = false;
// }
// });
}
private
void
addListener
()
{
mListView
.
addOnScrollListener
(
new
RecyclerView
.
OnScrollListener
()
{
int
firstVisibleItem
,
visibleItemCount
,
totalItemCount
;
...
...
@@ -288,46 +168,54 @@ public class SelectMusicActivity extends BaseStatusActivity<VideoPresenter> impl
}
if
(!
isLoad
&&
(
totalItemCount
-
visibleItemCount
)
<=
firstVisibleItem
)
{
mPagerIndex
++;
findMusicDataList
(
mPagerIndex
,
""
);
setData
(
mPagerIndex
,
""
);
isLoad
=
true
;
}
}
});
}
public
void
startSearchTimer
(
String
key
)
{
cancelSearchTimer
();
isSearch
=
true
;
searchDatas
.
clear
();
SEARCH_TIMER
=
new
Timer
();
mSearchTask
=
new
SearchTimerTask
();
mSearchTask
.
setKey
(
key
);
SEARCH_TIMER
.
schedule
(
mSearchTask
,
400
);
}
public
void
cancelSearchTimer
()
{
isSearch
=
false
;
if
(
SEARCH_TIMER
!=
null
)
{
SEARCH_TIMER
.
cancel
();
}
if
(
mSearchTask
!=
null
)
{
mSearchTask
.
cancel
();
}
}
@Override
public
void
onShowResult
(
int
requestType
,
BaseBean
result
)
{
switch
(
requestType
)
{
case
1
:
intokenBean
=
(
VideoIMTokenBean
)
result
;
setData
(
mPagerIndex
,
""
);
setData
(
0
,
""
);
break
;
case
2
:
setMusicData
((
MusicInfoBean
)
result
);
break
;
}
}
private
void
setMusicData
(
MusicInfoBean
result
)
{
List
<
MusicInfo
>
data
=
result
.
getData
();
if
(
data
.
size
()
>
0
)
{
for
(
int
i
=
0
;
i
<
data
.
size
();
i
++)
{
MusicInfo
info
=
data
.
get
(
i
);
info
.
appendDown
(
"http://47.91.232.3:8089"
);
}
if
(
isSearch
)
{
searchDatas
.
addAll
(
data
);
adapter
.
setNewData
(
searchDatas
);
}
else
{
mdatas
.
addAll
(
data
);
adapter
.
setNewData
(
mdatas
);
}
if
(
data
.
size
()
<
20
)
{
more
=
false
;
}
hint
.
setVisibility
(
View
.
GONE
);
}
else
{
more
=
false
;
hint
.
setVisibility
(
View
.
VISIBLE
);
}
}
private
void
setData
(
int
index
,
String
keyword
)
{
Map
<
String
,
Object
>
map
=
new
LinkedHashMap
<>();
map
.
put
(
"pageIndex"
,
String
.
valueOf
(
index
));
...
...
@@ -336,101 +224,69 @@ public class SelectMusicActivity extends BaseStatusActivity<VideoPresenter> impl
map
.
put
(
"keyword"
,
keyword
);
}
map
.
put
(
"type"
,
4
);
mPresenter
.
postData
(
2
,
VideoApi
.
DISCOVERY_IM_MUSIC
,
Base
Bean
.
class
,
map
,
index
==
1
?
false
:
false
);
mPresenter
.
postData
(
2
,
VideoApi
.
DISCOVERY_IM_MUSIC
,
MusicInfo
Bean
.
class
,
map
,
index
==
1
?
false
:
false
);
}
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
// TODO: add setContentView(...) invocation
ButterKnife
.
bind
(
this
);
}
public
interface
OnMusicItemClick
{
void
onItemClick
(
MusicInfo
info
);
}
class
CommAvatarAdapter
extends
BaseRecAdapter
<
MusicInfo
,
CommAvatarHolder
>
{
public
CommAvatarAdapter
(
List
<
MusicInfo
>
list
)
{
super
(
list
);
private
void
playMusic
(
int
position
)
{
if
(!
isSearch
&&
mCurrPlay
==
position
)
{
return
;
}
@Override
public
void
onHolder
(
CommAvatarHolder
holder
,
MusicInfo
bean
,
int
position
)
{
holder
.
tvName
.
setText
(
bean
.
getName
());
holder
.
tvContent
.
setText
(
bean
.
getNikeName
());
GlideApp
.
with
(
mContext
).
load
(
bean
.
getCover
()).
placeholder
(
R
.
drawable
.
defaultpic
)
.
error
(
R
.
drawable
.
image_download_fail_icon
)
.
into
(
holder
.
ivAvatar
);
if
(
bean
.
state
==
0
)
{
holder
.
mLlWrap
.
setVisibility
(
View
.
GONE
);
holder
.
ivState
.
setImageResource
(
R
.
drawable
.
ic_music_state0
);
}
else
if
(
bean
.
state
==
1
)
{
holder
.
mLlWrap
.
setVisibility
(
View
.
VISIBLE
);
holder
.
ivState
.
setImageResource
(
R
.
drawable
.
ic_music_state2
);
}
else
if
(
bean
.
state
==
2
)
{
holder
.
mLlWrap
.
setVisibility
(
View
.
GONE
);
holder
.
ivState
.
setImageResource
(
R
.
drawable
.
ic_music_state1
);
}
else
if
(
bean
.
state
==
3
)
{
holder
.
mLlWrap
.
setVisibility
(
View
.
VISIBLE
);
holder
.
ivState
.
setImageResource
(
R
.
drawable
.
ic_music_state0
);
}
}
VoiceManager
.
instance
().
stop
();
List
<
MusicInfo
>
data
=
isSearch
?
searchDatas
:
mdatas
;
@Override
public
CommAvatarHolder
onCreateHolder
()
{
return
new
CommAvatarHolder
(
getViewByRes
(
R
.
layout
.
item_trill_music
)
);
if
(
mCurrPlay
>
-
1
&&
data
.
size
()
>
mCurrPlay
)
{
data
.
get
(
mCurrPlay
).
state
=
0
;
adapter
.
notifyItemChanged
(
mCurrPlay
);
}
}
public
class
CommAvatarHolder
extends
BaseRecViewHolder
{
public
TextView
tvName
;
public
TextView
tvContent
;
public
ImageView
ivAvatar
;
public
ImageView
ivState
;
public
LinearLayout
mLlWrap
;
View
.
OnClickListener
listener
=
v
->
playMusic
(
getAdapterPosition
());
public
CommAvatarHolder
(
View
rootView
)
{
super
(
rootView
);
tvName
=
rootView
.
findViewById
(
R
.
id
.
tv_name
);
tvContent
=
rootView
.
findViewById
(
R
.
id
.
tv_nike_name
);
ivAvatar
=
rootView
.
findViewById
(
R
.
id
.
iv_cover
);
mLlWrap
=
rootView
.
findViewById
(
R
.
id
.
ll_next
);
ivState
=
rootView
.
findViewById
(
R
.
id
.
iv_play_state
);
ivAvatar
.
setOnClickListener
(
listener
);
rootView
.
findViewById
(
R
.
id
.
rl_content
).
setOnClickListener
(
listener
);
mLlWrap
.
setOnClickListener
(
v
->
{
VoiceManager
.
instance
().
stop
();
// SelectMusicDialog.this.dismiss();
if
(
mListener
!=
null
)
{
List
<
MusicInfo
>
data
=
isSearch
?
searchDatas
:
mdatas
;
MusicInfo
info
=
data
.
get
(
getAdapterPosition
());
File
file
=
Downloader
.
getInstance
().
getFile
(
info
.
getPath
());
if
(
file
.
exists
())
{
// 动态设置一下
info
.
setPath
(
file
.
getAbsolutePath
());
}
mListener
.
onItemClick
(
info
);
mCurrPlay
=
position
;
mCurrMusic
=
data
.
get
(
position
);
MusicInfo
info
=
data
.
get
(
position
);
// 去下载路径找
Downloader
.
getInstance
().
init
(
FrameApp
.
getInstance
().
mFilesDir
);
File
file
=
Downloader
.
getInstance
().
getFile
(
info
.
getPath
());
Log
.
e
(
"xuan"
,
"down : "
+
info
.
getPath
());
if
(
file
.
exists
())
{
data
.
get
(
mCurrPlay
).
state
=
1
;
adapter
.
notifyItemChanged
(
mCurrPlay
);
VoiceManager
.
instance
().
play
(
file
);
}
else
{
data
.
get
(
mCurrPlay
).
state
=
2
;
adapter
.
notifyItemChanged
(
mCurrPlay
);
Downloader
.
getInstance
().
addDownload
(
info
.
getPath
(),
new
DownloadListener
()
{
@Override
public
void
onStarted
(
String
uri
,
View
view
)
{
Log
.
e
(
"xuan"
,
"开始下载"
);
}
});
}
}
public
class
SearchTimerTask
extends
TimerTask
{
private
String
keyword
;
@Override
public
void
onFailed
(
String
uri
,
FailReason
failReason
,
View
view
)
{
Log
.
e
(
"xuan"
,
"onFailed: 下载失败"
+
mCurrMusic
.
getPath
());
Toast
.
makeText
(
mContext
,
mContext
.
getString
(
R
.
string
.
tip_file_download_failed
),
Toast
.
LENGTH_SHORT
).
show
();
}
@Override
public
void
run
()
{
findMusicDataList
(
0
,
keyword
);
}
@Override
public
void
onComplete
(
String
uri
,
String
filePath
,
View
view
)
{
Log
.
e
(
"xuan"
,
"comp: "
+
filePath
);
if
(
Downloader
.
getInstance
().
getFile
(
mCurrMusic
.
getPath
()).
getAbsolutePath
().
equals
(
filePath
))
{
mCurrMusic
.
setPath
(
filePath
);
VoiceManager
.
instance
().
play
(
filePath
);
data
.
get
(
mCurrPlay
).
state
=
1
;
adapter
.
notifyItemChanged
(
mCurrPlay
);
}
}
public
void
setKey
(
String
key
)
{
this
.
keyword
=
key
;
@Override
public
void
onCancelled
(
String
uri
,
View
view
)
{
Log
.
e
(
"xuan"
,
"取消下载"
);
}
});
}
}
}
plugin_video/src/main/java/com/xxrv/video/adapter/SelectMusicAdapter.java
0 → 100644
View file @
3fb7cf3c
package
com
.
xxrv
.
video
.
adapter
;
import
android.widget.ImageView
;
import
com.chad.library.adapter.base.BaseQuickAdapter
;
import
com.chad.library.adapter.base.BaseViewHolder
;
import
com.ruiwenliu.wrapper.util.glide.GlideManager
;
import
com.xxrv.video.R
;
import
com.xxrv.video.bean.circle.MusicInfo
;
/**
* 音乐选择
*/
public
class
SelectMusicAdapter
extends
BaseQuickAdapter
<
MusicInfo
,
BaseViewHolder
>
{
public
SelectMusicAdapter
()
{
super
(
R
.
layout
.
item_trill_music
);
}
@Override
protected
void
convert
(
BaseViewHolder
helper
,
MusicInfo
item
)
{
helper
.
setText
(
R
.
id
.
tv_name
,
item
.
getName
());
helper
.
setText
(
R
.
id
.
tv_nike_name
,
item
.
getNikeName
());
GlideManager
.
getInstance
(
mContext
).
loadImage
(
item
.
getCover
(),
(
ImageView
)
helper
.
getView
(
R
.
id
.
iv_cover
));
if
(
item
.
state
==
0
)
{
helper
.
setGone
(
R
.
id
.
ll_next
,
false
);
helper
.
setBackgroundRes
(
R
.
id
.
iv_play_state
,
R
.
drawable
.
ic_music_state0
);
}
else
if
(
item
.
state
==
1
)
{
helper
.
setGone
(
R
.
id
.
ll_next
,
true
);
helper
.
setBackgroundRes
(
R
.
id
.
iv_play_state
,
R
.
drawable
.
ic_music_state2
);
}
else
if
(
item
.
state
==
2
)
{
helper
.
setGone
(
R
.
id
.
ll_next
,
false
);
helper
.
setBackgroundRes
(
R
.
id
.
iv_play_state
,
R
.
drawable
.
ic_music_state1
);
}
else
if
(
item
.
state
==
3
)
{
helper
.
setGone
(
R
.
id
.
ll_next
,
true
);
helper
.
setBackgroundRes
(
R
.
id
.
iv_play_state
,
R
.
drawable
.
ic_music_state0
);
}
helper
.
addOnClickListener
(
R
.
id
.
rl_content
);
helper
.
addOnClickListener
(
R
.
id
.
ll_next
);
}
}
plugin_video/src/main/java/com/xxrv/video/bean/circle/MusicInfoBean.java
0 → 100644
View file @
3fb7cf3c
package
com
.
xxrv
.
video
.
bean
.
circle
;
import
com.ruiwenliu.wrapper.base.BaseBean
;
import
java.util.List
;
public
class
MusicInfoBean
extends
BaseBean
{
private
List
<
MusicInfo
>
data
;
private
boolean
rel
;
public
List
<
MusicInfo
>
getData
()
{
return
data
;
}
public
void
setData
(
List
<
MusicInfo
>
data
)
{
this
.
data
=
data
;
}
public
boolean
isRel
()
{
return
rel
;
}
public
void
setRel
(
boolean
rel
)
{
this
.
rel
=
rel
;
}
}
plugin_video/src/main/res/layout/item_trill_music.xml
View file @
3fb7cf3c
...
...
@@ -2,7 +2,7 @@
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"
match_par
ent"
android:layout_height=
"
wrap_cont
ent"
android:orientation=
"horizontal"
>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment