简体   繁体   中英

Android playing sounds from a fragment

I've found multiple similar posts but have been unable to resolve so posting my code for help.

I have 3 fragments that use a ViewPager with a PagerAdapter to allow for swiping between fragments. This project started with no fragments and I was able to play sounds from buttons clicked all from MainActivity.

Here's the code that worked.

MainActivity

    import android.media.MediaPlayer;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    public class MainActivity extends AppCompatActivity {

    MediaPlayer example1Sound;
    MediaPlayer example2Sound;
    MediaPlayer example3Sound;
    MediaPlayer example4Sound;
    MediaPlayer example5Sound;
    MediaPlayer example6Sound;
    MediaPlayer example7Sound;
    MediaPlayer example8Sound;
    MediaPlayer example9Sound;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    example1Sound = MediaPlayer.create(this, R.raw.example1);
    example2Sound = MediaPlayer.create(this, R.raw.example2);
    example3Sound = MediaPlayer.create(this, R.raw.example3);
    example4Sound = MediaPlayer.create(this, R.raw.example4);
    example5Sound = MediaPlayer.create(this, R.raw.example5);
    example6Sound = MediaPlayer.create(this, R.raw.example6);
    example7Sound = MediaPlayer.create(this, R.raw.example7);
    example8Sound = MediaPlayer.create(this, R.raw.example8);
    example9Sound = MediaPlayer.create(this, R.raw.example9);


    }

    public void playExampleSound1(View view) {
    example1Sound.start();
    }

    public void playExampleSound2(View view) {
    example2Sound.start();
    }

    public void playExampleSound3(View view) {
    example3Sound.start();
    }

    public void playExampleSound4(View view) {
    example4Sound.start();
    }

    public void playExampleSound5(View view) {
    example5Sound.start();
    }

    public void playExampleSound6(View view) {
    example6Sound.start();
    }

    public void playExampleSound7(View view) {
    example7Sound.start();
    }

    public void playExampleSound8(View view) {
    example8Sound.start();
    }

    public void playExampleSound9(View view) {
    example9Sound.start();
    }
    }

activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.anjosoft.MainActivity">

    <TableRow
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageButton"
            android:layout_column="0"
            android:background="@drawable/button1"
            android:onClick="playExampleSound1" />

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageButton2"
            android:layout_column="1"
            android:background="@drawable/button2"
            android:onClick="playExampleSound2" />

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageButton3"
            android:layout_column="2"
            android:background="@drawable/button3"
            android:onClick="playExampleSound3" />
    </TableRow>

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageButton4"
            android:layout_column="0"
            android:background="@drawable/button4"
            android:onClick="playExampleSound4" />

         <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageButton5"
            android:layout_column="1"
            android:background="@drawable/button5"
            android:onClick="playExampleSound5" />

         <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageButton6"
            android:layout_column="2"
            android:background="@drawable/button6"
            android:onClick="playExampleSound6" />
    </TableRow>

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageButton7"
            android:layout_column="0"
            android:background="@drawable/button7"
            android:onClick="playExampleSound7" />

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageButton8"
            android:layout_column="1"
            android:background="@drawable/button8"
            android:onClick="playExampleSound8" />

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageButton9"
            android:layout_column="2"
            android:background="@drawable/button9"
            android:onClick="playExampleSound9" />
    </TableRow>

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Send Sound"
            android:id="@+id/checkBox"
            android:layout_column="1" />
     </TableRow>
</TableLayout>

I know it's not pretty. Should have made an array but nevertheless it worked.

So here's my problem. Using the same ideology I tied the same thing with fragment.

MainActivity.java

    import android.support.v4.app.FragmentActivity;
    import android.support.v4.view.ViewPager;
    import android.os.Bundle;

    public class MainActivity extends FragmentActivity {
    ViewPager viewpager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewpager = (ViewPager)findViewById(R.id.pager);
        PagerAdapter padapter = new       PagerAdapter(getSupportFragmentManager());
        viewpager.setAdapter(padapter);
    }
    }

PagerAdapter.java

    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;

    public class PagerAdapter extends FragmentPagerAdapter{
    public PagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0:
                return new FragmentOne();
            case 1:
                return new FragmentTwo();
            case 2:
                return new FragmentThree();
            default:
                break;
        }
        return null;
    }

    @Override
    public int getCount() {
        return 3;
    }
    }

activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.view.ViewPager      xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    </android.support.v4.view.ViewPager>

FragmentOne.java

    import android.app.Activity;
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;

    public class FragmentOne extends Fragment {

    MediaPlayer example1Sound;
    MediaPlayer example2Sound;
    MediaPlayer example3Sound;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


        example1Sound = MediaPlayer.create(this.getActivity(), R.raw.example1);
        example2Sound = MediaPlayer.create(this.getActivity(), R.raw.example2);
        example3Sound = MediaPlayer.create(this.getActivity(), R.raw.example3);


        return    inflater.inflate(R.layout.fragment_one_layout,container,false);


    }

    public void playExampleSound1(View view){
        example1Sound.start();
    }

    public void playExampleSound2(View view) {
        example2Sound.start();
    }

    public void playExampleSound3(View view) {
        example3Sound.start();
    }
 }

fragnment_one_layout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout     xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"          android:layout_height="match_parent"
    android:background="#f70808">

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/imageButton"
                android:layout_column="0"
                android:background="@drawable/button1"
                android:onClick="playExampleSound1"
                android:nestedScrollingEnabled="false" />

            <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/imageButton2"
                android:layout_column="1"
                android:background="@drawable/button2" />

            <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/imageButton3"
                android:layout_column="2"
                android:background="@drawable/button3" />
        </TableRow>
    </TableLayout>
    </RelativeLayout>

Clicking on imagebutton crashes the app. I know the MediaPlayer can work inside the app because I tested inserting example1Sound.start(); like this...

Snippet from FragmentOne.java

       example1Sound = MediaPlayer.create(this.getActivity(), R.raw.example1);
       example2Sound = MediaPlayer.create(this.getActivity(), R.raw.example2);
       example3Sound = MediaPlayer.create(this.getActivity(), R.raw.example3);
       example1Sound.start();

The sound plays when the fragment loads. How do I get the onclick to work?

You can use onClickListeners for each button, it works.

I think, fragnment_one_layout.xml is linked to FragmentOne.java using inflater but the fragnment_one_layout.xml has no access to FragmentOne.java, and hence the statement onClick="methodName" is not able to access the desired method. mediaPlayer object has no connection with your problem.

You can make one function that redirect sound from Activity to Fragment! in Activity

 fun onSound(sound:Int){
    mp = MediaPlayer.create(this,soundFile)
    mp.start
 } 

from fragment

 onResume{
   (activity as ActivityName).onSound(R.raw.sound)

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM