我该如何重新创建片段?

时间:2016-09-02 16:19:37

标签: android android-fragments

我正在使用一个名为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;

}

但我不想重新创建包含视图寻呼机的完整活动,我想重新创建片段。我怎么能这样做?

8 个答案:

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