Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 调用fragment.setArguments()时,fragment已处于活动状态_Android_Android Fragments - Fatal编程技术网

Android 调用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

我正在创建一个活动,该活动根据从父活动传递的参数显示视频列表(VideoListingActivity)。我正在尝试将传递给VideoListingActivity的捆绑传递给其子片段,以便它可以从数据库获取相关数据并在活动上显示。我试图使用Fragment.setArguments()将捆绑包传递给Fragment,但出现以下错误

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();