利用NavhostFragment解决Fragment的入栈问题

利用NavhostFragment解决Fragment的入栈问题

谈到这个问题,首先我不得不说说我原本的耗时又费力还不完美的解决方案。

  • 不好的解决方法
    • 使用FragmentTransaction来实现Fragment的切换
    public FragmentTransaction switchFragment(Fragment targetFragment) {
        FragmentTransaction transaction = getSupportFragmentManager()
                .beginTransaction();
        if (!targetFragment.isAdded()) {
            //第一次使用switchFragment()时currentFragment为null,所以要判断一下
            if (currentFragment != null) {
                transaction.hide(currentFragment);
            }
            transaction.add(R.id.content_fragment, targetFragment,targetFragment.getClass().getName());

        } else {
            transaction
                    .hide(currentFragment)
                    .show(targetFragment);
        }
        currentFragment = targetFragment;
        return   transaction;
    }
  • 然后创建Fragment->Activity的监听
public interface reserve_fragment_to_activity {
    /**从fragment发送消息
     * @param msg 消息内容
     * */
    void sendMessage(String msg);
}
  • 然后再在Fragment和Activity中实现该接口并完成接口功能

    • Fragment
    	private reserve_fragment_to_activity smessage;
    
        @Override
    	public void onAttach(@NonNull Context context) {
            super.onAttach(context);
            smessage = (reserve_fragment_to_activity) context;
        }
    Click中启动监听
    	smessage.sendMessage("select room");
    
    • Activity
    实现该接口并重写该方法
        @Override
        public void sendMessage(String msg) {
            if(msg.equals("first show")){
                switchFragment(fragment_first).commit();
            }else if(msg.equals("select room")){
                switchFragment(fragment_room).commit();
            }else if(msg.equals("room info")){
                switchFragment(fragment_info).commit();
            }else if(msg.equals("room time")){
                switchFragment(fragment_time).commit();
            }
    
            Toast.makeText(getBaseContext(), "成功!", Toast.LENGTH_SHORT).show();
        }
    
  • 好的解决方法

    • 创建Navigation资源文件,这个在AS里面可以自动生成
    
    
        
        
        
        
        
        
        
        
    
    
  • 然后在layout资源文件中引用

android:layout_width=“match_parent”
android:layout_height=“match_parent”>

    


```
  • 最后就是切换了,一句代码解决它
id为Navigation资源文件的id
Navigation.findNavController(v).navigate(R.id.TargetFragment);

总结如下

第一种方式是创建了多个Fragment对象,然后完成显示和隐藏
第二种是使用组件完成Fragment的切换
不同情况,不同分析
第二种不仅节约了资源,而且完美高效的解决了Fragment的入栈问题

你可能感兴趣的:(利用NavhostFragment解决Fragment的入栈问题)