android-fragments 如何重新创建片段?

inkz8wg9  于 2022-11-13  发布在  Android
关注(0)|答案(9)|浏览(201)

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

}

但是我不想重新创建包含视图分页器的完整Activity,我想重新创建片段。如何才能做到这一点?

htrmnn0y

htrmnn0y1#

我使用.detach().attach()来重新创建片段。

连接

在先前已使用detach(Fragment)从UI取消锁定片段之后,重新附加片段。这会导致重新建立其视观表阶层、附加至UI并显示。

分离

从UI中分离给定片段。这与将其放在后台堆栈上时的状态相同:片段从UI中被移除,但是它的状态仍然由片段管理器主动管理。2当进入这个状态时,它的视图层次被破坏。

如何使用

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

7tofc5zh2#

您可以用途:

getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, LobbyFragment.newInstance()).commit();

若要重新创建片段
注意:getSupportFragmentManager()是如果你使用支持片段和AppCompatActivity,如果你使用框架片段类你需要使用getFragmentManager()

xkrw2x1b

xkrw2x1b3#

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

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

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

fcwjkofz

fcwjkofz4#

“献给Kotlin的情人"
如果要重新创建片段,则应先使用detach()片段,然后再使用attach()片段
请执行以下步骤

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()
    }
}

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

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

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

ar7v8xwq5#

如果要从活动刷新,请用途:

getSupportfragmentmanager()
  .begintransaction
  .detach(fragment)
  .attach(fragment)
  .addtobackstack(null)
  .commit();

如果您已经处于片段中,则用途:

public class MyDetailFragment extends Fragment {
  ....
  private void refreshFragment(){
    getFragmentManager()
      .beginTransaction()
      .detach(this)
      .attach(this)
      .addToBackStack(null)
      .commit();
  }
  ...
}
b5buobof

b5buobof6#

使用导航组件的用户!!:只是把自己的目的地。
第一个

mnowg1ta

mnowg1ta7#

使用Ciardini的方法有时会出错,但总是这样:

FragmentTransaction ft = getFragmentManager().beginTransaction();

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

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

xbp102n08#

我不得不使用2个事务来重新加载片段的内容列表:

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

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

j7dteeu89#

在我的例子中,我有一个片段,当我点击一个按钮时,我需要重新创建这个片段,我在片段(MyFragmentClass)类的onCreateView中做了如下操作:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    ...
    Button annuler = (Button) rootView.findViewById(R.id.buttonAnnulerCreation);
    annuler.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getParentFragmentManager().beginTransaction().replace(R.id.fragmentLayout, new MyFragmentClass()).commit();
            }
        }); }

相关问题