gpt4 book ai didi

android - 在 Android fragment 中,在 onClick 事件后不播放声音

转载 作者:行者123 更新时间:2023-11-30 00:56:39 25 4
gpt4 key购买 nike

我对这一切都很陌生,所以我开始编写这个应用程序来学习。

该应用程序以 6 个可点击的图像开始,这些图像导致由一系列“可滑动”屏幕组成的辅助 Activity ,每个屏幕都有一个图像,点击时会产生声音。以下是生成屏幕所需的辅助代码和 fragment 代码:

二级页面.java

import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;

public class SecondaryPage extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Set the content of the activity to use the activity_main.xml layout file
setContentView(R.layout.secondary);

// Find the view pager that will allow the user to swipe between fragments
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);

// Create an adapter that knows which fragment should be shown on each page
SimpleFragmentPagerAdapter adapter = new SimpleFragmentPagerAdapter(getSupportFragmentManager());

// Set the adapter onto the view pager
viewPager.setAdapter(adapter);
}
}

SimpleFragmentAdapter.java

AnimalsFragement.java(Croc()Camel() 除了名称相同之外)

import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;

import static com.example.testfrags.R.layout.animals;

public class AnimalsFragment extends Fragment {
private ImageView imageView;
private MediaPlayer mp;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = null;
//Inflating View to access it's resources

v = inflater.inflate(animals, container, false);
Log.i("AnimalsFragment", "mp before playing: " + mp);

//creating clickable image

imageView = (ImageView) v.findViewById(R.id.jungle_animals);

// Sound played once clicked
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Start playback.
mp = MediaPlayer.create(getActivity(), R.raw.lioncub2);
Log.i("AnimalsFragment", "mp: " + mp);
mp.start();
mp.stop();//Stops playback - added precaution

// release media resources
releaseMediaPlayer();
Log.i("AnimalsFragment", "mp after release: " + mp);
// Little msg confirm end of sound
Toast.makeText(v.getContext(), "Questo era il Leoncino", Toast.LENGTH_SHORT).show();

}
});

return v;
} // end of onCreatView

/**
* Clean up the media player by releasing its resources.
*/
private void releaseMediaPlayer() {
// If the media player is not null, then it may be currently playing a sound.
if (mp != null) {
// Regardless of the current state of the media player, release its resources
// because we no longer need it.
mp.reset();
mp.release();

// Set the media player back to null.

} // end of if
} // end of releaseMediaPlayer

@Override
public void onStop() {
super.onStop(); // Always call the superclass method first
releaseMediaPlayer();

}


}

这些是 xml 文件:secondary.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</LinearLayout>

animals.xml(croc.xml和camel.xml是一样的)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">

<ImageView
android:id="@+id/jungle_animals"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/lion"/>

</LinearLayout>

应用程序编译并运行,但当我点击任何 fragment 中的任何图像时,没有声音播放。我已经在我的设备上尝试过并模拟过但没有。

我做错了什么?

我尝试在行中使用 v.getContext() 更改 getActivity() :

`mp = MediaPlayer.create(getActivity(), R.raw.lioncub2);` 

但没有任何变化。所有声音文件都是 mp3。我还编写了一个没有 fragment 的 secondaryPage.java 版本,其中包含三个图像,只是为了查看 mp3 文件是否可以工作并且它们都可以正常播放。我还插入了 Toast 消息,只是为了检查 onClick() 方法是否正常工作,确实如此。当我调试并进入 mp = MediaPlayer.create(getActivity(), R.raw.lioncub2); 行并继续时,会播放声音。

这是 Log.i 语句的输出:

10-15 10:50:36.962 2459-2459/com.example.testfrags I/Croc: mp before playing: null
10-15 10:50:37.682 2459-2459/com.example.testfrags I/Choreographer: Skipped 36 frames! The application may be doing too much work on its main thread.
10-15 10:50:39.472 2459-2459/com.example.testfrags I/AnimalsFragment: mp: android.media.MediaPlayer@b0fd1480
10-15 10:50:39.482 2459-2459/com.example.testfrags I/AnimalsFragment: mp after release: null

在此先感谢您的帮助!

最佳答案

您的问题是您在媒体播放器启动后立即停止并释放它。从您的代码中删除停止方法,然后将播放声音。

现在仅仅删除 stop 并不能解决你的全部问题,如果你想使用 MediaPlayer 类,你现在必须做一些工作,因为 MediaPlayer 需要很多工作

如果您的声音或音频的持续时间很短,您应该使用 SoundPool 类。

您的问题似乎与我之前回答过的这个问题类似。 link

解决您的问题:

解决方案一:

在保存 fragment 的 Activity 类中声明 mediaPlayer 并实现 TabLayout.OnTabSelectedListener

... MainActivity extends AppCompatActivity implements TabLayout.OnTabSelectedListener{...
MediaPlayer mediaPlayer = null;
....
@Override
public void onTabSelected(TabLayout.Tab tab)
{
int position= tab.getPosition();
switch(position)
{
case 1: if(mediaPlayer!=null)
{
mediaPlayer.stop();
mediaPlayer.realse();
}
break;
case 2: if(mediaPlayer!=null)
{
mediaPlayer.stop();
mediaPlayer.realse();
}
break;
....
}
....
}

现在在您的 Fragment 中只需像这样添加 MainActivity 的引用:

public class AnimalsFragment extends Fragment {
private ImageView imageView;
private MainActivity mainActivity;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = null;
mainActivity=(MainActivity)getActivity();
....
....
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Start playback.
mainActivity.mediaPlayer=MediaPlayer.create(mainActivity, R.raw.song);
mediaPlayer.start();

....
....
....}

我希望这会奏效。

关于android - 在 Android fragment 中,在 onClick 事件后不播放声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40060667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com