2013-06-12 2 views
0

Я хочу, чтобы мой звуковой файл воспроизводился автоматически, когда я прихожу к новому фрагменту (путем прокрутки). Прямо сейчас звук не воспроизводится. Есть, возможно, фундаментальное различие междуГде разместить MediaPlayer во фрагменте?

public void OnAttach(Activity Fragment1){ 

и

public void OnAttach(Fragment Fragment1){ 

Спасибо за любую помощь. Код:

package com.example.test21; 

import java.util.Locale; 

import android.app.ActionBar; 
import android.app.FragmentTransaction; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.View; 
import android.view.ViewGroup; 

public class MainActivity extends FragmentActivity implements 

ActionBar.TabListener { 

    SectionsPagerAdapter mSectionsPagerAdapter; 

    ViewPager mViewPager; 

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

     final ActionBar actionBar = getActionBar(); 
     actionBar.hide(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     mSectionsPagerAdapter = new SectionsPagerAdapter(
       getSupportFragmentManager()); 

     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 
     mViewPager 
       .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
        @Override 
        public void onPageSelected(int position) { 
         actionBar.setSelectedNavigationItem(position); 
        } 
       }); 

     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
      actionBar.addTab(actionBar.newTab() 
        .setText(mSectionsPagerAdapter.getPageTitle(i)) 
        .setTabListener(this)); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) { 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabUnselected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) { 
    } 

    @Override 
    public void onTabReselected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) { 
    } 

    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
      return new Fragment0(); 
       case 1: 
      return new Fragment1(); 
       case 2: 
      return new Fragment2(); 
       default: 
      return null; 
     }} 

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

     @Override 
     public CharSequence getPageTitle(int position) { 
      Locale l = Locale.getDefault(); 
      switch (position) { 
      case 0: 
       return getString(R.string.title_section1).toUpperCase(l); 
      case 1: 
       return getString(R.string.title_section2).toUpperCase(l); 
      case 2: 
       return getString(R.string.title_section3).toUpperCase(l); 
      } 
      return null; 
     } 
    } 

    public static class Fragment0 extends Fragment { 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
      View view = inflater.inflate(R.layout.fragment_0, null); 
      return view; 
     } 
} 

public static class Fragment1 extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_1, null); 
     return view; 
    } 
    public void OnAttach(Activity Fragment1){ 
     super.onAttach(Fragment1); 
     MediaPlayer mp = MediaPlayer.create(Fragment1.getApplication(), R.raw.s1); 
     mp.start(); 
    } 
} 
     //This fragment is supposed to start the MediaPlayer, but is doesn't 
    public static class Fragment2 extends Fragment { 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
      View view = inflater.inflate(R.layout.fragment_2, null); 
      return view; 
     } 
    } 

} 

ответ

1

Для MediaPlayer нужен контекст для создания экземпляра. Вы проходите в Фрагменте. Вы можете создать его в onAttach

http://developer.android.com/reference/android/app/Fragment.html#onAttach(android.app.Activity)

http://developer.android.com/guide/components/fragments.html#EventCallbacks

+0

Спасибо! Я отредактировал код (см. Выше), и я больше не получаю никаких сообщений об ошибках, однако звук не воспроизводится на экране, я боюсь, что мои ссылки не очень хорошие. – user2365708

0

Вы кладете его в методе onCreateView(), если вы хотите воспроизводить звук при запуске нового фрагмента.

+0

Я пробовал это, но я получаю ту же ошибку рядом с MediaPlayer.create, как будто мой публичный void PlayClick или public View onCreateView не являются хорошими заполнителями для присоединения MediaPlayer к – user2365708

+0

. Как насчет: MediaPlayer mp = MediaPlayer.create (getBaseContext(), R.raw.s1); // Я не уверен, что это сработает. –

+0

onActivityCreated (Bundle savedInstanceState) работал для меня – cjayem13

Смежные вопросы