我有一个ListView活动,显示我原始文件中的歌曲列表,当我单击其中一个ListView时,它会相应地播放歌曲,但如果我再次单击,它只会再次播放同一首歌曲。如何在同一曲目上暂停并再次恢复?以下是我迄今为止所做的代码。
<代码>主要活动。java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
private ListView musicListView;
private Trackmodel[] tracklist;
private TrackAdapter adapter;
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
musicListView = findViewById(R.id.musicListView);
loadTracks();
musicListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
loadTracks();
Trackmodel track = tracklist[i];
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.reset();
track.setPlaying(false);
}
}
try {
mediaPlayer = MediaPlayer.create(MainActivity.this, track.getId());
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.reset();
track.setPlaying(false);
} else {
mediaPlayer.start();
track.setPlaying(true);
}
} catch (Exception e) {
Log.e("Exception", e.getMessage());
}
}
});
}
public void loadTracks() {
tracklist = new Trackmodel[]{
new Trackmodel(R.raw.decode, "Paramore - Decode", false),
new Trackmodel(R.raw.thats_what_you_get, "Paramore - That's What You Get", false),
new Trackmodel(R.raw.starstrukk, "30H!3 - Starstrukk", false),
new Trackmodel(R.raw.we_are_young, "30H!3 - We Are Young", false)
};
adapter = new TrackAdapter(MainActivity.this, tracklist);
musicListView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.reset();
}
}
}}
<代码>轨迹模型。java
package com.example.myapplication;
public class Trackmodel {
private int id;
private String name;
private boolean isPlaying;
public Trackmodel(int id, String name, boolean isPlaying) {
this.id = id;
this.name = name;
this.isPlaying = isPlaying;
}
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 boolean isPlaying() {
return isPlaying;
}
public void setPlaying(boolean playing) { isPlaying = playing; }
}
轨迹适配器。java
package com.example.myapplication;
import android.content.Context;
import android.view.ContentInfo;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class TrackAdapter extends BaseAdapter {
private Context context;
private Trackmodel[] tracks;
TrackAdapter(Context context, Trackmodel[] tracks) {
this.context = context;
this.tracks = tracks;
}
@Override
public int getCount() {
return tracks.length;
}
@Override
public Object getItem(int i) {
return tracks[i];
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
Trackmodel track = (Trackmodel) getItem(i);
ViewHolder holder;
if (view == null) {
view = LayoutInflater.from(context).inflate(R.layout.track_item, viewGroup, false);
holder = new ViewHolder();
holder.trackImage = view.findViewById(R.id.track_image);
holder.titleText = view.findViewById(R.id.track_title);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
holder.titleText.setText(track.getName());
if (track.isPlaying()) {
holder.trackImage.setImageResource(R.drawable.ic_baseline_pause_circle);
} else {
holder.trackImage.setImageResource(R.drawable.ic_baseline_play_circle);
}
return view;
}
static class ViewHolder {
ImageView trackImage;
TextView titleText;
}
}
track_item.xml代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/sound_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="16sp"
android:paddingTop="10dp"
android:paddingRight="16sp">
<ImageView
android:id="@+id/track_image"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_centerVertical="true"
android:padding="5dp"
app:tint="@android:color/black" />
<TextView
android:id="@+id/track_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="56dp"
android:textAppearance="@style/TextAppearance.AppCompat.Body2" />
</RelativeLayout>
<代码>activity\u main。xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<ListView
android:id="@+id/musicListView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
在项目单击中,您可以停止MediaPlayer,但之后,每次都会创建一个新实例。您有一个if check,它检查MediaPlayer是否正在播放并停止播放。然后,创建一个新的MediaPlayer,并再次执行相同的检查。那么,当您第一次单击时发生了什么?首先,如果由于您的mediaplayer为空而未执行检查,则会创建一个新的mediaplayer并开始播放。第二次单击后,由于MediaPlayer不为null且显示为true,因此第一次执行if检查。您可以停止它,创建一个新的MediaPlayer实例,然后再次播放。这就是为什么在单击所有下一次后,您只需重播歌曲。因为单击可以停止歌曲,创建一个新实例并播放它。
所以你需要的是,我假设你的列表中有不同的曲目,当你点击另一个曲目时,你需要停止之前的曲目并开始新的曲目。但如果你点击同一首曲目,你会想暂停它。
在这种情况下,您需要当前正在播放/播放的曲目ID。下次单击后,如果曲目ID与正在播放的曲目相同,您只需暂停它。如果是另一首曲目,请停止它并开始新的曲目。这是下面的代码,您可以进行相应的更改并将其应用到您的代码中。
int currentTrackId = -1;
musicListView.setOnItemClickListener(
(AdapterView.OnItemClickListener) (adapterView, view, i, l) -> {
loadTracks();
Trackmodel track = tracklist[i];
if (currentTrackId != -1 && track.getId() == currentTrackId) {
// That was the same song, just pause it.
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
track.setPlaying(false);
} else {
mediaPlayer.start();
track.setPlaying(true);
}
}
} else {
// That's another song, stop the previous one and start the new one
currentTrackId = track.getId();
try {
mediaPlayer = MediaPlayer.create(MainActivity.this, track.getId());
mediaPlayer.start();
track.setPlaying(true);
} catch (Exception e) {
Log.e("Exception", e.getMessage());
}
}
});
问题内容: 我在viewDidAppear中有一个图像,并用以下代码对其进行了动画处理: 我想在点击时暂停动画,如果再次点击它则继续播放动画。 问题答案: 暂停和恢复动画的2个功能,我从这里开始转换为Swift。 我有一个按钮可以暂停或恢复在中初始化的动画:
我相信答案是否定的,但是Twilio提供暂停/恢复录音的能力吗?用例是记录一个呼叫,但在收集敏感信息时暂停记录。从REST文档来看,它似乎不是一个受支持的功能。我想有人可能已经为这个要求找到了一些选择。
问题内容: 我有一个基本的Swing UI,带有一个标记为“播放”的按钮。按下按钮后,标签变为“暂停”。现在,当按下按钮时,它变为“继续”。 在“播放”中,我将实例化并执行一个SwingWorker。我想要的是能够暂停该线程(不要取消该线程),并根据上述按钮按下来恢复它。但是,我不想在doInBackground()中求助于Thread.sleep()。这似乎有点骇人听闻。有什么方法可以阻止运行d
我要做的是暂停< code>KafkaConsumer,如果在使用消息的过程中出现错误。 这是我写的 然后我写了一个REST服务来恢复消费者 现在,我有两个问题。第一个问题:当我打电话给消费者时。来自<code>@KafkaListener</code>注释方法的pause()会发生什么?消费者立即暂停,或者我可以接收到同一主题分区的其他偏移量上的其他消息。例如,我有偏移量为3的“message1
问题内容: 我正在开发游戏,我想创建一个暂停菜单。这是我的代码: 但 仍在运行… 我想在玩家单击暂停菜单时暂停计时器,并在玩家返回游戏时继续运行计时器,但是我如何暂停?请帮帮我。 问题答案: 您需要使其无效并重新创建。然后,如果您使用相同的按钮暂停和恢复计时器,则可以使用bool来跟踪状态:
问题内容: 我已经开发了一个倒数计时器,但不确定单击计时器的文本视图时如何暂停和恢复计时器。单击开始,然后再次单击以暂停并继续,再次单击计时器的文本视图。 这是我的代码: 问题答案: 资料来源:本要点。