2013-09-05 2 views
0

Для всех тех, кто занижает и голосует за этот вопрос, чтобы быть закрытым, думая, что это имеет какое-то отношение к сфере охвата текста ... тогда взгляните, это не имеет никакого отношения к сфере текста.Как передавать данные между фрагментами?

Невозможно передать данные между фрагментами, происходит сбой приложения, я не знаю, что я делаю неправильно ... я следовал этой ссылке http://manishkpr.webheavens.com/android-passing-data-between-fragments/

вот код, я использую фрагмент A (этот фрагмент проходит данные)

public class FragmentSongs extends Fragment implements Serializable,OnFragmentCreatedListener { 
ListView SngList; 


ArrayList<SongDetails> Songinfo=null; 
AdapterView.AdapterContextMenuInfo info; 

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

    ViewGroup view = (ViewGroup) inflater.inflate(R.layout.fragment_song, null); 

    SngList = (ListView) view.findViewById(R.id.SongList); 
    registerForContextMenu(SngList); 
    //File f=new File(Environment.getExternalStorageDirectory()+"/Music"); 
    File f=new File("/system/"); 
    int j=0;int i=0; 

    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     Songinfo = getSongsFromDirectory(f); 



    //sorting done below 
    if (Songinfo.size()>0) 
    { 

     for(j=0; j<Songinfo.size();j++) 
     { 
      for (i=j+1 ; i<Songinfo.size(); i++) 
      { 
       SongDetails a=Songinfo.get(i); 
       SongDetails b=Songinfo.get(j); 
       if(a.getSong().toLowerCase().compareTo(b.getSong().toLowerCase())<0) 
       { 

        Songinfo.set(i,b); 
        Songinfo.set(j,a); 
       } 
      } 

     } 






    SngList.setAdapter(new CustomAdapter(Songinfo)); 
    return view; 
    } 
    else return null; 

} 
OnFragmentCreatedListener listener; 
@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     listener = (OnFragmentCreatedListener) getActivity(); 
     listener.onFragmentCreated(Songinfo); 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement onFragmentCreated"); 
    } 
} 

fragm лор В (фрагмент приемника)

public class FragmentArtists extends Fragment { 
    ArrayList<SongDetails> songinfo2; 
ViewGroup view; 
int s=5;//TextView text; 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) 
{Context context; 
LayoutInflater lf = getActivity().getLayoutInflater(); 

    view = (ViewGroup) inflater.inflate(R.layout.fragment_artist, null); 
// view = lf.inflate(R.layout.test,container, false); 
// view = inflater.inflate(R.layout.test,container, false); 


s=s+5; 
//  text=(TextView)view.findViewById(R.id.tt);when i use this,it works fine but i want to do it in the other method 

//text.setText("makzzz");when i use this,it works fine but i want to do it in the other method 
return view; 

} 

void setSongList(ArrayList<SongDetails> songinfo) 
{ //TextView text=(TextView)this.getView().findViewById(R.id.tt);//when i used this view was not global 
     TextView text=(TextView)view.findViewById(R.id.tt);//when i used this,view was global; 
     //TextView text=(TextView)view.findViewById(R.id.tt); 
    // text=(TextView)super.getView().findViewById(R.id.tt); 


    text.setText("makzzz"); 

метод в держателе активности (эта активность имеет фрагменты)

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mymusic); 


      fragments = new Vector<Fragment>(); 
      fragments.add(Fragment.instantiate(this, FragmentSongs.class.getName())); 
      fragments.add(Fragment.instantiate(this, FragmentArtists.class.getName())); 
      fragments.add(Fragment.instantiate(this, FragmentPlaylists.class.getName())); 
      fragments.add(Fragment.instantiate(this, FragmentAlbums.class.getName())); 


      ViewPagerAdapter adapter = new ViewPagerAdapter(super.getSupportFragmentManager(), fragments); 


      ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager); 



      pager.setAdapter(adapter); 
      pager.setOffscreenPageLimit(4); 

      pager.setCurrentItem(0); 

    }  public void onFragmentCreated(ArrayList<SongDetails> msg) { 
      FragmentArtists Obj=(FragmentArtists) fragments.get(1); 
      Obj.setSongList(msg); 
      } 

    } 

класс обратного вызова:

package sourcecode.jazzplayer; 

import java.util.ArrayList; 

public interface OnFragmentCreatedListener { 
    public void onFragmentCreated(ArrayList<SongDetails> msg); 

} 

вот LogCat

09-19 23:50:46.851: E/AndroidRuntime(2125): java.lang.NullPointerException 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at sourcecode.jazzplayer.FragmentArtists.setSongList(FragmentArtists.java:55) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at sourcecode.jazzplayer.MyMusic.onFragmentCreated(MyMusic.java:45) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at sourcecode.jazzplayer.FragmentSongs.onAttach(FragmentSongs.java:128) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:883) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:823) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:819) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:130) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.support.v4.view.ViewPager.populate(ViewPager.java:1066) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.support.v4.view.ViewPager.populate(ViewPager.java:914) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.View.measure(View.java:12603) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.View.measure(View.java:12603) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:660) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.View.measure(View.java:12603) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2072) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.View.measure(View.java:12603) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1044) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2418) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.os.Looper.loop(Looper.java:137) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at android.app.ActivityThread.main(ActivityThread.java:4340) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at java.lang.reflect.Method.invoke(Method.java:511) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
09-19 23:50:46.851: E/AndroidRuntime(2125):  at dalvik.system.NativeStart.main(Native Method) 

ошибка в этой строке кода

TextView text = (TextView) view.findViewById (R.id.tt); // эта строка в фрагменте приемника (fragmentArtist)

+0

Возможно, мы сможем помочь, если узнаем, что такое авария. Можете ли вы разместить логарифм? – andy256

+0

Опубликовать logcat ... Но я думаю, вы должны использовать другой способ передачи данных между фрагментом (например, аргумент widh) – Pauland

+0

@Pauland, пожалуйста, дайте мне ссылку, другой способ передачи данных –

ответ

2

Как я уже сказал в своем комментарии, вы пытаетесь работать с Fragment, когда он еще не инициализирован правильно. Когда FragmentSongs присоединен к Activity (действие, запрошенное ViewPager, где оно появится), его onAttach() метод. В этом методе вы передаете Activity вашему слушателю, , но вы также сразу вызываете обратный вызов слушателя. Это приведет к сбою вашего приложения (за исключением того, что вы отправили), потому что в этом слушателе вы пытаетесь работать с видом второго Fragment из ViewPager, FragmentArtists. Этот Fragment еще не инициализирован, в этот момент первый фрагмент ViewPager едва привязан к этой активности, и вы уже пытаетесь работать с представлением о втором фрагменте, который, очевидно, потерпит неудачу.

Учебник, с которым вы связались, в порядке, упрощен, но нормально (без перехода к этой ссылке я предположил, что ваш код из учебника). Проблема в том, что вы использовали этот код из очень упрощенного сценария в более сложной ситуации (на самом деле, если вы вставляете свой текущий код в код этого учебника, вы получите то же исключение (слишком рано называть слушателя)).

Этот интерфейс прослушивателя обратного вызова должен использоваться, когда фрагмент полностью построен (например, когда пользователь использует приложение и выбирает песню, и вы хотите показать ему исполнительскую часть приложения (в этот момент вызывают слушателя и передать данные)), также тщательно обрабатывая возможность недоступности фрагмента.

Если вам необходимо передать данные между фрагментами так рано в жизненном цикле фрагмента, что вы не можете гарантировать, что фрагмент еще доступен (например, вы вызываете слушателя в onAttach() фрагмента), затем реализуйте фрагмент, чтобы получить данные непосредственно от деятельности, когда она построена, в одном из ее методов жизненного цикла. То, что вы проходите, неясно, поэтому я не могу сказать здесь.

+0

У меня есть вопрос для вас ...... pager.setOffscreenPageLimit (4); (этот код находится в активности держателя, где я определил свои фрагменты). не делает этого строка кода гарантирует, что мои фрагменты будут созданы в одно и то же время ... ??? –

+0

, и если это не так, мы можем использовать пейджер представления для создания нескольких фрагментов одновременно, и как только они будут созданы, то отобразите их только? –

+0

и учебное пособие, которое я прочитал, также представлено на веб-сайте разработчика –

0

Ваш FragmentSongs класс должен реализовать OnFragmentCreatedListener

public class FragmentSongs extends Fragment implements OnFragmentCreatedListener { 

    public void onFragmentCreated(ArrayList<SongDetails> msg) { 
    // whatever 
    } 


} 

или в onAttach вашей 'Фрагмент A':

 listener = (OnFragmentCreatedListener) activity; 

это будет означать, что вам необходимо выполнить ActivityOnFragmentCreatedListener

+0

, что в свою очередь дает мне другую ошибку (NullPointException) ........ ... в фрагменте B ... в методе (который предназначен для установки чего-то после получения информации из другого фрагмента), и ошибка находится в этой строке text.setText ("makzzz"); –

+0

ну да, поэтому я ответил на ваш вопрос. Теперь одно из ваших просмотров равно null (другой отдельный вопрос). – Blundell

+1

ну, я дам щедрость u, если я решу эту проблему (поскольку это может привести к другой проблеме, связанной с этим) –

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