Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.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/6/ant/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 如何重新创建片段?_Android_Android Fragments - Fatal编程技术网

Android 如何重新创建片段?

Android 如何重新创建片段?,android,android-fragments,Android,Android Fragments,我正在使用一个名为SwipeRefreshLayout的小部件,在有人推送视图时刷新我的片段 要重新创建活动,我必须使用: SwipeRefreshLayout mSwipeRefreshLayout; public static LobbyFragment newInstance() { return new LobbyFragment(); } @Override public View onCreateView(LayoutInflater inflater, ViewGro

我正在使用一个名为SwipeRefreshLayout的小部件,在有人推送视图时刷新我的片段

要重新创建活动,我必须使用:

SwipeRefreshLayout mSwipeRefreshLayout;

public static LobbyFragment newInstance() {
    return new LobbyFragment();
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.fragment_lobby, container, false);


    receiver = new MySQLReceiver();

    rlLoading = (RelativeLayout) view.findViewById(R.id.rlLoading);
    gvLobby = (GridView) view.findViewById(R.id.gvLobby);

    updateList();

    mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.mSwipeRefreshLayout);
    mSwipeRefreshLayout.setColorSchemeResources(R.color.pDarkGreen, R.color.pDarskSlowGreen, R.color.pLightGreen, R.color.pFullLightGreen);
    mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {

            getActivity().recreate();
        }


    });


    return view;

}
但是我不想重新创建包含视图寻呼机的完整活动,我想重新创建片段。我如何才能做到这一点?

您可以使用:

getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, LobbyFragment.newInstance()).commit();
重新创建你的片段

注意:
getSupportFragmentManager()
是指如果您使用的是support fragment和AppCompatActivity,如果您使用的是framework fragment类,则需要使用
getFragmentManager()
我使用的是
.detach()
.attach()
来重新创建片段

附加

在先前使用detach(fragment)从UI中删除片段后,重新附加该片段。这将导致其视图层次结构被重新创建、附加到UI并显示

分离

从UI分离给定片段。这与将其放在后堆栈上时的状态相同:片段已从UI中删除,但其状态仍由片段管理器主动管理。进入此状态时,其视图层次结构将被破坏

我如何使用它

getFragmentManager()
        .beginTransaction()
        .detach(LobbyFragment.this)
        .attach(LobbyFragment.this)
        .commit();

如果您使用的是导航组件,则可以使用:

findNavController().navigate(
    R.id.current_dest,
    arguments,
    NavOptions.Builder()
        .setPopUpTo(R.id.current_dest, true)
        .build()
)

这让NavController弹出当前片段,然后导航到自身。您将获得一个新片段,片段ViewModel也将被重新创建

如果要从“活动”刷新,请使用:

getSupportfragmentmanager()
.开始换药
.分离(碎片)
.附上(碎片)
.addtobackstack(空)
.commit();
如果您已经在片段中,请使用:


公共类MyDetailFragment扩展了片段{
....
私有void refreshFragment(){
getFragmentManager()
.beginTransaction()
.拆下(这个)
.附上(本)
.addToBackStack(空)
.commit();
}
...
}

谁使用导航组件!!: 只需设定一个自我目标

<action
   android:id="@+id/action_piecesReferenceCount_self"
   app:destination="@id/piecesReferenceCount" />

为Kotlin情人

如果要重新创建片段,应该先删除dettach()片段,然后附加()片段

请按此步骤操作

setp:1,首先在活动类上创建一个方法recreateFragment()

fun recreateFragment(fragment : Fragment){
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
        supportFragmentManager.beginTransaction().detach(fragment).commitNow()
        supportFragmentManager.beginTransaction().attach(fragment).commitNow()
    }else{
        supportFragmentManager.beginTransaction().detach(fragment).attach(fragment).commitNow()
    }
}
步骤:2,然后对片段调用此方法以重新创建此片段

    button.setOnClickListener {
        (activity as yourActivity).recreateFragment(this)
    }

    
假设点击一个按钮,然后重新创建这个片段

    button.setOnClickListener {
        (activity as yourActivity).recreateFragment(this)
    }

    

我必须为片段使用2个事务来重新加载其内容列表:

FragmentTransaction ftr = getSupportFragmentManager().beginTransaction();
ftr.detach(localCurrentPrimaryItem)
                        .commit();

FragmentTransaction ftr2 = getSupportFragmentManager().beginTransaction();
ftr2.attach(localCurrentPrimaryItem)
                        .commit();

使用Ciardini的方法,我有时会出错。这总是有效的:

FragmentTransaction ft = getFragmentManager().beginTransaction();

if (Build.VERSION.SDK_INT >= 26) {
    ft.setReorderingAllowed(false);
}

ft.detach(this).attach(this).commitAllowingStateLoss();

共享片段创建代码是因为您想更新片段中的数据列表吗?是的,我使用的是gridview,我想更新该gridview当重新创建活动时,直接使用viewpager.setCurrentItem(片段位置)转到您喜欢的片段@RúbenDias检查我的回答我认为
LobbyFragment.newInstance()
在newInstance之前缺少一个
,否则感谢您的帮助answer@Rick77这是一个方法调用,所以它不会缺少一个类对吧,我的错:我错过了问题中的那个部分,我以为你的意图是LobbyFragment.class.newInstance().这对我有效,但第一个答案没有。谢谢我应该在哪里称呼它???@pavel,在哪里你需要重新创建碎片问题是,传递给碎片的任何参数都将变为null