2016-07-26 14 views
1

EDIT 2陣列:片段適配器:設置屬於一個片段從主活動

public class PageAdapter extends FragmentStatePagerAdapter { 
    ArrayList<Song> songList; //Update 
    public PageAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int i) { 
     switch (i) { 
      case 0: 
       return MusicList.newInstance(songList); //Update 
     } 
     return null; 
    } 

    @Override 
    public int getCount() { 
     return 1; //No of Tabs 
    } 
} 

編輯: id.music_list_fragment(layout.fragment_main)佈局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/music_list_fragment" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:background="@drawable/headphones"> 

    <ListView 
     android:id="@+id/song_list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:clickable="true"> 
    </ListView> 

</LinearLayout> 

我試圖通過替換片段將活動「MainActivity」的數組列表發送到其片段「MusicList」。

通過在活動使用這樣的:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    Fragment fragment = MusicList.newInstance(songList); 
    ft.replace(R.id.music_list_fragment, fragment); 
    ft.commit(); 

而在片段使用此:

public static MusicList newInstance(ArrayList<Song> songList) { 
    MusicList fragment = new MusicList(); 
    Bundle bundle = new Bundle(); 
    bundle.putSerializable(DESCRIBABLE_KEY, songList); 
    fragment.setArguments(bundle); 

    return fragment; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_main, container, false); 
    mList = ((ListView)v.findViewById(R.id.song_list)); 
    msongList = (ArrayList<Song>) getArguments().getSerializable(DESCRIBABLE_KEY); 
    SongAdapter sAdapter = new SongAdapter(getActivity(), msongList); 
    mList.setAdapter(sAdapter); 

    return v; 
} 

而且我得到這個錯誤:

java.lang.RuntimeException: Unable to start activity ComponentInfo{pal.mplayercomeon/pal.mplayercomeon.MainActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f0c0074 (pal.mplayercomeon:id/music_list_fragment) for fragment MusicList{ee972d3 #0 id=0x7f0c0074} 
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
                     at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                     at android.os.Looper.loop(Looper.java:154) 
                     at android.app.ActivityThread.main(ActivityThread.java:6077) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
                    Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f0c0074 (pal.mplayercomeon:id/music_list_fragment) for fragment MusicList{ee972d3 #0 id=0x7f0c0074} 
                     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1059) 
                     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252) 
                     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742) 
                     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617) 
                     at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:339) 
                     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:601) 
                     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1248) 
                     at android.app.Activity.performStart(Activity.java:6681) 
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609) 
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)  
                     at android.app.ActivityThread.-wrap12(ActivityThread.java)  
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)  
                     at android.os.Handler.dispatchMessage(Handler.java:102)  
                     at android.os.Looper.loop(Looper.java:154)  
                     at android.app.ActivityThread.main(ActivityThread.java:6077)  
                     at java.lang.reflect.Method.invoke(Native Method)  
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)  
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)  
+0

是music_list_fragment定義爲片段嗎?請張貼布局 – Lino

+0

您應該使用包含'Fragment'的'View'的'id',而您使用的當前'id'值構成'Fragment'佈局的一部分。 – PPartisan

+0

@PPartisan將其更改爲「容器」,這是支付碎片的視圖,現在我在這一行上收到錯誤:msongList =(ArrayList )getArguments()。getSerializable(DESCRIBABLE_KEY); java.lang.NullPointerException:嘗試在空對象引用上調用虛擬方法'java.io.Serializable android.os.Bundle.getSerializable(java.lang.String)' –

回答

1
  1. 您需要初始化一個ArrayList你傳遞給片段newInstance方法,否則它是空的。
  2. 您正在使用PagerAdapter,因此您將其添加到ViewPager。你不需要FragmentTransaction,所以代碼是不相關的。適配器的getCount方法加載ViewPager中的許多碎片。
  3. 2後續行動,這是不對的...... ft.replace(R.id.music_list_fragment, fragment);,除非android:id="@+id/music_list_fragment"包含爲的FrameLayout活動 XML,而不是XML片段內。但是,如前所述,你似乎想用ViewPager

附加點 - 宋需要實現Serializable,但是,你真的應該使用Parcelable,因爲這是在Android中傳遞數據的首選方式。

0

你想通過從活動中調用片段的linearlayout視圖標識來替換活動中的片段視圖。 您需要添加<FrameLayout>到你的活動XML

<FrameLayout android:id="@+id/fragment_placeholder" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

這將持有你的地方片段,直到你會打電話:

ft.replace(R.id.fragment_placeholder, fragment);

相關問題