Android 调用fragment.setArguments()时,fragment已处于活动状态
我正在创建一个活动,该活动根据从父活动传递的参数显示视频列表(VideoListingActivity)。我正在尝试将传递给VideoListingActivity的捆绑传递给其子片段,以便它可以从数据库获取相关数据并在活动上显示。我试图使用Fragment.setArguments()将捆绑包传递给Fragment,但出现以下错误Android 调用fragment.setArguments()时,fragment已处于活动状态,android,android-fragments,Android,Android Fragments,我正在创建一个活动,该活动根据从父活动传递的参数显示视频列表(VideoListingActivity)。我正在尝试将传递给VideoListingActivity的捆绑传递给其子片段,以便它可以从数据库获取相关数据并在活动上显示。我试图使用Fragment.setArguments()将捆绑包传递给Fragment,但出现以下错误 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rrdtech.vid
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rrdtech.vidyavaan.android/com.rrdtech.vidyavaan.android.VideoListingActivity}: java.lang.IllegalStateException: Fragment already active
我认为该片段已附加到activity post to 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)
{
}
}
公共类VideoListFragment扩展了片段{
私有ListView视频ListView;
私有上下文活动上下文;
专用视频适配器列表适配器;
私人名单录像名单;
私有束b;
私有字符串listBy;
私有字符串主语;
私有字符串类型;
@凌驾
公共事务主任(活动){
超级转速计(活动);
activityContext=activity.getApplicationContext();
b=新的束();
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
返回充气机。充气(右布局。视频列表\u碎片,容器,错误);
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
b=getArguments();
listBy=b.getString(VidyavaanGlobal.listBy);
Log.d(“列表依据”,列表依据);
}
@凌驾
public void onStart(){
super.onStart();
}
公共无效筛选器SelectedAction(字符串x)
{
Log.d(“通过的是”,x);
}
公共数据()
{
添加视频列表(新视频(“第1章”、“标题1”、“布拉格公立学校”、“帕万萨拉斯卡”、“化学”、“进步”、“abcd url”、“21”、“5/6/2015”、“缩略图url”);
添加视频列表(新视频(“第2章”、“标题2”、“布拉格公立学校”、“帕万·萨拉斯卡”、“物理学”、“进步”、“abcd url”、“21”、“5/6/2015”、“缩略图url”);
添加视频列表(新视频(“第3章”、“标题3”、“布拉格公立学校”、“pawan saraskar”、“英语”、“高级”、“abcd url”、“21”、“5/6/2015”、“缩略图url”);
视频列表。添加(新视频(“第4章”、“标题4”、“布拉格公立学校”、“帕万萨拉斯卡”、“化学”、“进步”、“abcd url”、“21”、“5/6/2015”、“缩略图url”);
添加视频列表(新视频(“第5章”、“标题5”、“布拉格公立学校”、“pawan saraskar”、“化学”、“进步”、“abcd url”、“21”、“5/6/2015”、“缩略图url”);
添加视频列表(新视频(“第6章”、“标题6”、“布拉格公立学校”、“pawan saraskar”、“化学”、“进步”、“abcd url”、“21”、“5/6/2015”、“缩略图url”);
添加视频列表(新视频(“第7章”、“标题7”、“布拉格公立学校”、“pawan saraskar”、“化学”、“进步”、“abcd url”、“21”、“5/6/2015”、“缩略图url”);
}
public void displayVideoList(布尔搜索请求)
{
}
public void displayVideoList(字符串pListBy、字符串pValue)
{
listAdapter=新的VideosListAdapter(activityContext,videosList);
videoListView.setAdapter(listAdapter);
}
public void displayVideoList(字符串主体、字符串videoType、字符串VideoLevel)
{
}
}
谁能帮忙吗。提前感谢。来自官方Android开发参考: 公共void setArguments(Bundle args)提供了构造 此片段的参数。这只能在 碎片已附着在其活动上;也就是说,你应该打电话 它在构建片段后立即被激活。提供的参数 这里将在碎片销毁和创建过程中保留 你的片段已经附加到它的活动中了,我建议你使用你自己的方法,你不需要
setArguments
在fragment类中创建自己的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 */
}
}
}
召唤
以前
ft =getFragmentManager().beginTransaction();
行。尝试调用
ft=getFragmentManager().beginTransaction()代码>添加捆绑包作为参数后。我相信您已经在活动的xml布局中添加了片段,因为您的片段已经被添加,因此您无法调用setArguments。是的,我已经在活动的xml布局中添加了片段?通过XML布局(如onCreate()->AttachFragment())添加时是否没有遵循循环?我从XML布局中删除了片段,并将其动态添加到活动中。它解决了问题,对你有效。我试过这种方法。问题是,每当我尝试重新连接列表适配器以根据新参数显示结果时。它在VideoListViews上引发了NullPointer异常findFragmentById是否返回null?是的,它是。。现在它开始工作了。我所做的是。。。。在活动的XML中,我添加了framelayout,然后动态添加了片段。使用transaction.replace()方法。谢谢你的建议…一个疑问是我想使用相同的片段来显示同一活动中searchvideo查询的结果。。。你认为可以做到吗?
ft =getFragmentManager().beginTransaction();