2015-06-11 38 views
0

我正在創建一個活動,顯示視頻列表(VideoListingActivity),這取決於從父activity.my傳遞的參數我想通過傳遞給VideoListingActivity的包到它的子片段,以便它可以從數據庫中獲取相關數據並將其顯示在活動中。我試圖使用Fragment.setArguments()將包傳遞給片段,但得到下面的錯誤。片段已被激活,而調用Fragment.setArguments()

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rrdtech.vidyavaan.android/com.rrdtech.vidyavaan.android.VideoListingActivity}: java.lang.IllegalStateException: Fragment already active 

我認爲該片段附加到onCreate()的活動後所以應該提高這個錯誤?

下面是我的活動和片段

VideoListingActivity.java

public class VideoListingActivity extends ActionBarActivity implements FilterFragment.OnFilterItemSelectedListener, 
    android.support.v7.widget.SearchView.OnQueryTextListener 
{ 

public VideoListFragment videoListFragment; 
private android.support.v7.widget.SearchView searchView; 
private Context context; 
private Bundle bundle; 
private String listBy; 
private String subjectId; 
private String levelType; 
private FragmentTransaction ft; 

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

    // videoListFragment=new VideoListFragment(); 
    videoListFragment= (VideoListFragment) getFragmentManager().findFragmentById(R.id.frg_video_listing_video_listing_fragment); 
    ft =getFragmentManager().beginTransaction(); 
    context=this; 
    bundle = new Bundle(); 
    bundle = getIntent().getExtras(); 
    videoListFragment.setArguments(bundle); 

} 

@Override 
protected void onStart() { 
    super.onStart(); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_video_listing, menu); 
    MenuItem menuItem=menu.findItem(R.id.item_action_search); 

    //SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    searchView = (android.support.v7.widget.SearchView) menu.findItem(R.id.item_action_search).getActionView(); 
    setupSearchView(menuItem); 
    //searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 

    return super.onCreateOptionsMenu(menu); 
} 

public void setupSearchView(MenuItem searchItem) 
{ 

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    if(searchManager != null) 
    { 
     SearchableInfo info = searchManager.getSearchableInfo(getComponentName()); 
     searchView.setSearchableInfo(info); 
    } 
    searchView.setOnQueryTextListener(this); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 


@Override 
public void onFilterItemSelected(String filterId) { 
    videoListFragment.filterSelectedAction("filter id is "+filterId); 
} 

@Override 
public boolean onQueryTextSubmit(String query) { 
    CommonFunctions commonFunctions = new CommonFunctions(); 
    commonFunctions.showProgressDialog(context,"getting data","bringing"); 

    ft.replace(R.id.frg_video_listing_filter_fragment,videoListFragment); 
    ft.commit(); 
    commonFunctions.dismissProgressDialog(); 
    return false; 
} 

@Override 
public boolean onQueryTextChange(String newText) { 
    return false; 
} 
} 

VideoListingFragment.java

public class VideoListFragment extends Fragment { 

private ListView videoListView; 
private Context activityContext; 
private VideosListAdapter listAdapter; 
private List<Video> videosList; 
private Bundle b; 
private String listBy; 
private String subjectId; 
private String levelType; 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    activityContext = activity.getApplicationContext(); 
    b=new Bundle(); 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.video_list_fragment,container,false); 


} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    b= getArguments(); 
    listBy = b.getString(VidyavaanGlobal.listBy); 
    Log.d("list by ",listBy); 
} 

@Override 
public void onStart() { 
    super.onStart(); 
} 


public void filterSelectedAction(String x) 
{ 
    Log.d("passed is ", x); 
} 

public void fillData() 
{ 
    videosList.add(new Video("chapter1","title1", "pragyan public school", "pawan saraskar", "Chemistry", "Advance", "abcd url", "21", "5/6/2015", "thumbnail url")); 
    videosList.add(new Video("chapter2","title2","pragyan public school","pawan saraskar","physics","Advance","abcd url","21","5/6/2015","thumbnail url")); 
    videosList.add(new Video("chapter3","title3","pragyan public school","pawan saraskar","english","Advance","abcd url","21","5/6/2015","thumbnail url")); 
    videosList.add(new Video("chapter4","title4","pragyan public school","pawan saraskar","Chemistry","Advance","abcd url","21","5/6/2015","thumbnail url")); 
    videosList.add(new Video("chapter5","title5","pragyan public school","pawan saraskar","Chemistry","Advance","abcd url","21","5/6/2015","thumbnail url")); 
    videosList.add(new Video("chapter6","title6","pragyan public school","pawan saraskar","Chemistry","Advance","abcd url","21","5/6/2015","thumbnail url")); 
    videosList.add(new Video("chapter7", "title7", "pragyan public school", "pawan saraskar", "Chemistry", "Advance", "abcd url", "21", "5/6/2015", "thumbnail url")); 
} 


public void displayVideoList(boolean searchReqeust) 
{ 

} 

public void displayVideoList(String pListBy, String pValue) 

{ 



    listAdapter = new VideosListAdapter(activityContext,videosList); 
    videoListView.setAdapter(listAdapter); 
} 

public void displayVideoList(String subjectId, String videoType, String VideoLevel) 
{ 

} 


} 

可以一個請幫助代碼。提前致謝。

+1

我相信你已經在活動的佈局xml中添加了你的片段,因爲你的片段已經被添加了,因此你不能調用setArguments。 – mudit

+0

是的,我已經在xml佈局的活動中添加了片段?在通過XML佈局添加onCreate() - > AttachFragment()時,不要執行循環? –

+0

我從xml佈局中刪除了片段,並在活動中動態添加了它。它整理了問題 –

回答

2

從官方Android開發參考:

公共無效setArguments(捆綁參數)供應建設 參數對該片段。這隻能在 片段附加到其活動之前調用;也就是說,你應該在構造片段後立即調用 。這裏提供的參數 將在片段銷燬和創建時保留。

你的片段已經附加到它的活動中,我建議你使用你自己的方法,你不需要setArguments

創建自己的setUIArguments(Bundle args)片段中類和更新這個方法裏面的片段UI

你會調用這個方法是這樣的:

@Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); 

     Bundle bundle = new Bundle(); 
     bundle.putSerializable(BUNDLE_KEY, obj);// passing this object 

     detailFragment.setUIArguments(bundle); /* your new method */ 
} 
片段類

public void setUIArguments(Bundle args) { 
    getActivity().runOnUiThread(new Runnable() { 
     public void run() { 
      /* do your UI stuffs */ 
     } 
    } 
} 
+0

我試過這種方式。問題是,每當我試圖重新附加列表適配器根據新的參數顯示結果。它拋出NullPointer異常在videoListView –

+0

你的findFragmentById返回null嗎? –

+0

是的,現在它的工作。我所做的是....在活動的XML我添加framelayout,然後動態地添加片段。使用transaction.replace()方法。感謝您的建議... –

0

致電

bundle = new Bundle(); 
bundle = getIntent().getExtras(); 
videoListFragment.setArguments(bundle); 

ft =getFragmentManager().beginTransaction(); 

線。

0

嘗試在將bundle添加爲參數後調用ft =getFragmentManager().beginTransaction();

相關問題