簡體   English   中英

如何在片段之間傳遞數據?

[英]How to Pass Data between Fragments?

對於所有那些對這個問題進行投票和投票的人來說,認為它與textview的范圍有關.....然后看看,它與textview的范圍無關

無法在片段之間傳遞數據,應用程序崩潰,我不知道我做錯了什么...我按照這個鏈接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");
    }
}

片段B(接收器片段)

    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)中

正如我在評論中已經說過的那樣,當它尚未正確初始化時,你正試圖使用Fragment FragmentSongs附加到ActivityViewPager請求它將出現的操作)時,將調用其onAttach()方法。 在此方法中,您將Activity為偵聽器, 但您也立即調用偵聽器的回調 這將使您的應用程序崩潰(與您發布的除外),因為在監聽你想與第二的視圖的工作Fragment中的ViewPagerFragmentArtists Fragment尚未初始化,此時ViewPager的第一個片段幾乎沒有附加到活動上,您已經嘗試使用第二個片段的視圖,這個視圖顯然會失敗。

你鏈接到的教程是好的,簡單的,但是沒問題(沒有去那個鏈接我假設你的代碼來自教程)。 問題是你在一個更復雜的情況下從一個非常簡單的場景中使用了這個代碼(事實上,如果你在當前教程的代碼中插入當前代碼,你將獲得相同的異常(過早地調用監聽器))。

片段完全構建時應該使用該回調偵聽器接口(例如當用戶使用應用程序並選擇一首歌並且您想向他顯示應用程序的藝術家部分時(此時調用偵聽器並使其通過)數據))還仔細處理片段不可用的可能性。

如果你需要在片段生命周期的早期片段之間傳遞數據,你不能保證片段可用(就像你在片段的onAttach()中調用監聽器那樣)然后實現片段直接獲取數據從它的構建活動開始,在其生命周期方法之一中。 你傳遞的東西不清楚所以我在這里說的不多。

FragmentSongs類需要實現OnFragmentCreatedListener

public class FragmentSongs extends Fragment implements OnFragmentCreatedListener { 

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


}

或者在'片段A'的onAttach上:

        listener =  (OnFragmentCreatedListener) activity;

這意味着您的Activity需要實現OnFragmentCreatedListener

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM