【问题标题】:How to Change Image in fab如何在工厂中更改图像
【发布时间】:2021-06-16 16:28:15
【问题描述】:

当我改变fragment 我的FAB (FloatingActionButton) 时,不要改变她的形象。我有这个方法来改变图像:

private void fabImages(){
    final NavHostFragment nhf = (NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_content_main);
    if(nhf != null){
        Fragment fragmentActual = nhf.getChildFragmentManager().getFragments().get(0);
        if(fragmentActual instanceof  HomeFragment){
            binding.appBarMain.fab.setImageResource(R.drawable.ic_add_auto_blanco);
        }else if(fragmentActual instanceof GalleryFragment){
            binding.appBarMain.fab.setImageResource(R.drawable.ic_save);
        }
    }
}

我正在将此活动用于我的应用程序:

我在MainActivityonCreateonResume 中应用此方法,但图像没有改变,为什么?

更新:

MainActivity:

public class MainActivity extends AppCompatActivity{
    private AppBarConfiguration mAppBarConfiguration;
    private ActivityMainBinding binding;
    private String horaString, fechaString;
    private NombreTallerPreferencia nombreTallerPreferencia;
    private PermissionHelper permissionHelper;
    private static final int PICK_IMAGE = 1;

    public static final String TAG = "logcat";
    public static final String BARRA = "/";

    private View view_imagen_perfil;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        setSupportActionBar(binding.appBarMain.toolbar);

        fabImages(); //method to change image

        DrawerLayout drawer = binding.drawerLayout;
        NavigationView navigationView = binding.navView;
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);
    }

    @Override
    protected void onResume() {
        super.onResume();
        fabImages(); //method to change image
    }

【问题讨论】:

  • 请展示一些代码
  • 我已经更新了答案,谢谢! @Ajithkumarmuthukumaran

标签: android fragment floating-action-button android-architecture-components android-architecture-navigation


【解决方案1】:

问题不在于如何为 FAB 设置可绘制对象,因为您已经这样做了。但是问题在于你在onResume() 中执行的操作。

场景如下:

  • 应用启动,onResume() 被触发,fabImages() 被调用,所以,它是HomeFragment,所以设置R.drawable.ic_add_auto_blanco,这对你有效。
  • 你去GalleryFragment,所以HomeFragment现在被隐藏了,GalleryFragment被显示了,但是这里活动的onResume()不会被调用,因为活动没有暂停(),即onPause () 没有被调用;
  • 当您在GalleryFragment 时,如果您通过旋转设备来更改配置,则onResume() 将被调用,因此fabImages(),fab 将其drawable 更改为R.drawable.ic_save

因此,您需要在活动的onResume 之外的其他地方调用fabImages()

要解决此问题,您需要在 Activity 中注册一个监听器,该监听器会跟踪导航何时更改其当前目的地,并通过 OnDestinationChangedListener 接口进行跟踪:

所以,在你的活动onCreate()

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    binding = ActivityMainBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());

    setSupportActionBar(binding.appBarMain.toolbar);

    fabImages(); //method to change image

    DrawerLayout drawer = binding.drawerLayout;
    NavigationView navigationView = binding.navView;
    mAppBarConfiguration = new AppBarConfiguration.Builder(
            R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow)
            .setDrawerLayout(drawer)
            .build();
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
    NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(navigationView, navController);
    
    
    
    /////////////////////////
    // Here is the new code:
    /////////////////////////
    
    NavController.OnDestinationChangedListener destinationChangedListener = new NavController.OnDestinationChangedListener() {
        @Override
        public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
            
            if (destination.getId() == R.id.nav_home) {
                binding.appBarMain.fab.setImageResource(R.drawable.ic_add_auto_blanco);

            } else if (destination.getId() == R.id.nav_gallery) {
                binding.appBarMain.fab.setImageResource(R.drawable.ic_save);
            }
        }
    };

    navController.addOnDestinationChangedListener(destinationChangedListener);
    
}

【讨论】:

    【解决方案2】:

    您的应用程序似乎没有像 else 这样的回退条件,只是以防您的值为空。 您可以在此处阅读有关更改 FAB 图标的更多信息 https://stackoverflow.com/a/32082108/12028348 或来自官方 android studio 文档 https://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      相关资源
      最近更新 更多