Android 如何重新创建片段?
我正在使用一个名为SwipeRefreshLayout的小部件,在有人推送视图时刷新我的片段 要重新创建活动,我必须使用: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 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