我正在使用一个名为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;
}
但我不想重新创建包含视图寻呼机的完整活动,我想重新创建片段。我怎么能这样做?
答案 0 :(得分:9)
您可以使用:
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, LobbyFragment.newInstance()).commit();
重新创建片段
注意:getSupportFragmentManager()
如果您使用支持片段和AppCompatActivity,如果您使用的是框架片段类,则需要使用getFragmentManager()
答案 1 :(得分:7)
我正在使用 .detach()
和 .attach()
来重新创建片段。
<强> ATTACH 强>
在先前已从具有分离(片段)的UI中取消片段之后重新附加片段。这会导致其视图层次结构被重新创建,附加到UI并显示。
<强> DETACH 强>
从UI中分离给定的片段。这与将其放在后台堆栈时的状态相同:片段从UI中删除,但其状态仍由片段管理器主动管理。进入此状态时,其视图层次结构将被销毁。
我如何使用
getFragmentManager()
.beginTransaction()
.detach(LobbyFragment.this)
.attach(LobbyFragment.this)
.commit();
答案 2 :(得分:2)
对于Kotlin Lover
如果您要重新创建片段,则应先dettach()片段,然后执行attach()片段
请按照此步骤
setp:1 ,首先在您的活动类上创建一个recreateFragment()方法
button.setOnClickListener {
(activity as yourActivity).recreateFragment(this)
}
步骤:2 ,然后在您的片段上调用此方法以重新创建该片段
假设单击一个按钮,然后重新创建此片段
public boolean verifyAnswer(String userAnswer) {
String correctAnswer = this.questions.get(currentQuestionIndex).correctAnswerText;
if(userAnswer.equals(correctAnswer)) {
timer.pauseTimer();
JOptionPane.showMessageDialog(null, "Correct Answer");
return false;
}
else {
timer.pauseTimer();
JOptionPane.showMessageDialog(null, "Wrong Answer");
return true;
}
}
答案 3 :(得分:1)
如果您要从活动中刷新而不是使用
getSupportfragmentmanager().begintransaction.detach(fragment).attach(fragment).addtobackstack(null).commit();
,如果您已经处于碎片状态,则不使用
getFragmentmanger().begintransaction().detach(fragment.this).attach(fragment.this).addtobackstack().commit();
答案 4 :(得分:1)
谁使用导航组件! : 只是把自己的目的地。
<action
android:id="@+id/action_piecesReferenceCount_self"
app:destination="@id/piecesReferenceCount" />
Navigation.findNavController(myview).navigate(R.id.action_piecesReferenceCount_self);
答案 5 :(得分:0)
如果您使用的是导航组件,则可以使用以下方法:
findNavController().navigate(
R.id.current_dest,
arguments,
NavOptions.Builder()
.setPopUpTo(R.id.current_dest, true)
.build()
)
这使NavController弹出当前片段,然后导航到其自身。您将获得一个新的Fragment,并且片段ViewModel也将被重新创建。
答案 6 :(得分:0)
我不得不为片段使用 2 个事务来重新加载其内容列表:
FragmentTransaction ftr = getSupportFragmentManager().beginTransaction();
ftr.detach(localCurrentPrimaryItem)
.commit();
FragmentTransaction ftr2 = getSupportFragmentManager().beginTransaction();
ftr2.attach(localCurrentPrimaryItem)
.commit();
答案 7 :(得分:0)
使用 Ciardini 的方法有时会出错。这始终有效:
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commitAllowingStateLoss();