我想将音量添加到操作栏。 当用户点击该操作时,它应将滑块放在操作栏中以便选择右侧 体积 我该怎么做
答案 0 :(得分:5)
处理此问题的最简单方法是使用ActionBar.setCustomView
。
以下是控制媒体音量的示例:
首先,您需要创建包含SeekBar
的自定义布局。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<SeekBar
android:id="@android:id/progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
</FrameLayout>
现在在SeekBar.OnSeekBarChangeListener
或Activity
中实施Fragment
并声明几个变量:
/** Used to actually adjust the volume */
private AudioManager mAudioManager;
/** Used to control the volume for a given stream type */
private SeekBar mVolumeControls;
/** True is the volume controls are showing, false otherwise */
private boolean mShowingControls;
在onCreate
或您选择的任何地方,将自定义View
充气并应用到ActionBar
。
// Control the media volume
setVolumeControlStream(AudioManager.STREAM_MUSIC);
// Initialize the AudioManager
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
// Inflate the custom ActionBar View
final View view = getLayoutInflater().inflate(R.layout.view_action_bar_slider, null);
mVolumeControls = (SeekBar) view.findViewById(android.R.id.progress);
// Set the max range of the SeekBar to the max volume stream type
mVolumeControls.setMax(mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
// Bind the OnSeekBarChangeListener
mVolumeControls.setOnSeekBarChangeListener(this);
// Apply the custom View to the ActionBar
getActionBar().setCustomView(view, new ActionBar.LayoutParams(MATCH_PARENT, MATCH_PARENT));
要在按下MenuItem
时切换控件,请拨打ActionBar.setDisplayShowCustomEnabled
并不要忘记将SeekBar
进度更新为您正在控制的当前音量级别。
// Toggle the custom View's visibility
mShowingControls = !mShowingControls;
getActionBar().setDisplayShowCustomEnabled(mShowingControls);
// Set the progress to the current volume level of the stream
mVolumeControls.setProgress(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
要在OnSeekBarChangeListener.onProgressChanged
来电AudioManager.setStreamVolume
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// Adjust the volume for the given stream type
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
}
最后在OnSeekBarChangeListener.onStopTrackingTouch
中,删除自定义控件以再次正常显示ActionBar
。
// Remove the SeekBar from the ActionBar
mShowingControls = false;
getActionBar().setDisplayShowCustomEnabled(false);
以下是您按MenuItem
之前和之后的图片。
答案 1 :(得分:0)
这是类似问题的answer。他想添加完整的音频控制按钮。您将了解如何将控件Seekbar
添加到actionBar
以及如何处理它。
我希望它有所帮助
答案 2 :(得分:0)
首先,根据需要将搜索栏添加到工具栏,这是我的解决方案
<androidx.appcompat.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:elevation="4dp"
android:minHeight="?attr/actionBarSize"
app:layout_constraintTop_toTopOf="parent"
app:title="Interval timer">
<SeekBar
android:id="@+id/AudioSliderToolbar"
android:layout_width="190dp"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:progress="999"/>
</androidx.appcompat.widget.Toolbar>
第二
创建两个变量
private var volumeSeekbar: SeekBar? = null
private var audioManager: AudioManager? = null
第三
创建时参与
//audio seekbar
setVolumeControlStream(AudioManager.STREAM_MUSIC);
initControls()
方法initControls()
//audio seek bar
private fun initControls() {
try {
volumeSeekbar = findViewById(R.id.AudioSliderToolbar)
audioManager = getSystemService(AUDIO_SERVICE) as AudioManager
volumeSeekbar!!.setMax(
audioManager!!
.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
)
volumeSeekbar!!.setProgress(
audioManager!!
.getStreamVolume(AudioManager.STREAM_MUSIC)
)
volumeSeekbar!!.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) {
// Display the current progress of SeekBar
audioManager!!.setStreamVolume(
AudioManager.STREAM_MUSIC,
i, 0
);
}
override fun onStartTrackingTouch(seekBar: SeekBar) {
// Do something
Toast.makeText(applicationContext, "start tracking", Toast.LENGTH_SHORT).show()
}
override fun onStopTrackingTouch(seekBar: SeekBar) {
// Do something
Toast.makeText(applicationContext, "stop tracking", Toast.LENGTH_SHORT).show()
}
})
} catch (e: Exception) {
//e.toString();
}
}
我希望这会对某人有所帮助,只是解决了这个问题,并希望与他人分享。 内纳德(Nenad)高兴