我该如何重新创建片段?

Rúb*_*ias 13 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;

}
Run Code Online (Sandbox Code Playgroud)

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

Col*_*ire 12

您可以使用 :

getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, LobbyFragment.newInstance()).commit();
Run Code Online (Sandbox Code Playgroud)

要重新创建片段

注意:getSupportFragmentManager()如果您使用支持片段和AppCompatActivity,如果您使用的是框架片段类,则需要使用getFragmentManager()


G. *_*ini 10

我正在使用 .detach() .attach() 用于重新创建片段。

连接

在先前使用detach(Fragment)从UI上释放了一个片段之后,重新附加它。这将导致其视图层次结构被重新创建,附加到UI并显示。

分离

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

我如何使用

getFragmentManager()
        .beginTransaction()
        .detach(LobbyFragment.this)
        .attach(LobbyFragment.this)
        .commit();
Run Code Online (Sandbox Code Playgroud)

  • 此方法不适用于Android SDK 23,Android Studio甚至提供了相关警告:**在同一个FragmentTransaction中调用detach()和attach()是无操作,这意味着它不会重新创建Fragment的视图。如果您希望重新创建视图,请将这些操作分成单独的事务。**我已经测试了这两种方法,只有以下方法对我有用:```getFragmentManager().beginTransaction().detach(LobbyFragment.this) .commit();``` ```getFragmentManager().beginTransaction().attach(LobbyFragment.this).commit();``` (3认同)
  • 这对我有用,第一个答案没有。谢谢! (2认同)

Dew*_*eed 6

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

findNavController().navigate(
    R.id.current_dest,
    arguments,
    NavOptions.Builder()
        .setPopUpTo(R.id.current_dest, true)
        .build()
)
Run Code Online (Sandbox Code Playgroud)

这让 NavController 弹出当前片段,然后导航到它自己。你会得到一个新的 Fragment 并且 Fragment ViewModel 也被重新创建。


Tar*_*der 6

对于 Kotlin 爱好者

如果你想重新创建片段,你应该 dettach() 片段然后 Attach() 片段

请按照此步骤操作

setp : 1,首先在您的 Activity 类上创建一个方法 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

步骤:2,然后在您的片段上调用此方法以重新创建此片段

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

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

    
Run Code Online (Sandbox Code Playgroud)