LinearLayout垂直方向如何使控件位于最底部

原因就是 LinearLayout的对排列向分为水平vertical和垂直horizontal两种,当对齐方向为水平方向即orientation="horizontal"时只有垂直方向的gravity属性才能起作用,即:top,bottom,center_vertical 生效。反之,left,right,center_horizontal 生效。

所以,如果想让垂直排列的LinearLayout中最底下的一个控件底部对齐,会发现使用layout_gravity="bottom"是没有效果的。但是实际开发过程中又会遇到这种需求,怎么操作呢?

可以在需要底部对齐的控件外层放一层RelativeLayout,设置这个RelativeLayout的高度和weight

android:layout_height="0dp" 
android:layout_weight="1"

然后再设置控件本身在RelativeLayout中的位置,使其位于底部即可,即layout_alignParentBottom=true。

 

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,根据您的任务要求,以下是一个简单的安卓代码示例,用于实现一个基本的音乐播放器。注意,这只是一个示例代码,具体的实现方式可能会有所不同。 音乐列表界面的Activity: ``` public class MusicListActivity extends AppCompatActivity { private ListView mListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_music_list); mListView = findViewById(R.id.list_view); mListView.setAdapter(new MusicListAdapter(this)); mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(MusicListActivity.this, MusicPlayActivity.class); intent.putExtra("position", position); startActivity(intent); } }); } } ``` 音乐播放界面的Activity: ``` public class MusicPlayActivity extends AppCompatActivity { private MediaPlayer mMediaPlayer; private ImageView mAlbumImage; private TextView mSongNameText; private TextView mArtistText; private TextView mCurrentTimeText; private TextView mTotalTimeText; private SeekBar mSeekBar; private Button mPlayButton; private Button mPauseButton; private Button mPrevButton; private Button mNextButton; private int mPosition; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_music_play); mPosition = getIntent().getIntExtra("position", 0); mMediaPlayer = new MediaPlayer(); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mSeekBar.setMax(mMediaPlayer.getDuration()); mTotalTimeText.setText(formatTime(mMediaPlayer.getDuration())); mp.start(); updateSeekBar(); } }); mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { playNext(); } }); mAlbumImage = findViewById(R.id.album_image); mSongNameText = findViewById(R.id.song_name_text); mArtistText = findViewById(R.id.artist_text); mCurrentTimeText = findViewById(R.id.current_time_text); mTotalTimeText = findViewById(R.id.total_time_text); mSeekBar = findViewById(R.id.seek_bar); mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { mMediaPlayer.seekTo(progress); updateSeekBar(); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { // Do nothing } @Override public void onStopTrackingTouch(SeekBar seekBar) { // Do nothing } }); mPlayButton = findViewById(R.id.play_button); mPlayButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mMediaPlayer.isPlaying()) { mMediaPlayer.pause(); mPlayButton.setVisibility(View.VISIBLE); mPauseButton.setVisibility(View.GONE); } else { mMediaPlayer.start(); mPlayButton.setVisibility(View.GONE); mPauseButton.setVisibility(View.VISIBLE); updateSeekBar(); } } }); mPauseButton = findViewById(R.id.pause_button); mPauseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mMediaPlayer.isPlaying()) { mMediaPlayer.pause(); mPlayButton.setVisibility(View.VISIBLE); mPauseButton.setVisibility(View.GONE); } } }); mPrevButton = findViewById(R.id.prev_button); mPrevButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { playPrev(); } }); mNextButton = findViewById(R.id.next_button); mNextButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { playNext(); } }); loadSongInfo(); } private void loadSongInfo() { // 根据mPosition从音乐列表中获取歌曲信息,包括歌曲名称、歌手名和海报图片等 // 然后将这些信息显示在相应的控件上 } private void playPrev() { mPosition--; if (mPosition < 0) { mPosition = MusicListData.getInstance().getSize() - 1; } playSong(); } private void playNext() { mPosition++; if (mPosition >= MusicListData.getInstance().getSize()) { mPosition = 0; } playSong(); } private void playSong() { mMediaPlayer.reset(); // 根据mPosition从音乐列表中获取歌曲的url,并设置给MediaPlayer try { mMediaPlayer.setDataSource(songUrl); mMediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } loadSongInfo(); } private void updateSeekBar() { if (mMediaPlayer.isPlaying()) { mCurrentTimeText.setText(formatTime(mMediaPlayer.getCurrentPosition())); mSeekBar.setProgress(mMediaPlayer.getCurrentPosition()); mHandler.postDelayed(mRunnable, 1000); } } private Handler mHandler = new Handler(); private Runnable mRunnable = new Runnable() { @Override public void run() { updateSeekBar(); } }; private String formatTime(int time) { int totalSeconds = time / 1000; int minutes = totalSeconds / 60; int seconds = totalSeconds % 60; return String.format("%02d:%02d", minutes, seconds); } @Override protected void onDestroy() { super.onDestroy(); mMediaPlayer.release(); mHandler.removeCallbacks(mRunnable); } } ``` 这是一个简单的示例代码,您可以根据自己的实际需求进行修改和完善。希望能对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值