Activity recreate时导致Fragment被添加多次,显示混乱问题

解决Activity重复添加Fragment问题
本文探讨了在Android开发中,由于Activity的reCreate导致的重复添加相同Fragment问题。提供了详细的解决方案,包括如何检查savedInstanceState状态,使用findFragmentByTag避免重复添加,以及正确处理onSaveInstanceState。

在某些场景下,旋转屏幕、内存不足,或app内切换语言主动调用reCreate()方法,造成Activity被destroy ,系统会recreate 重新创建该Activity ,会重走onCreate()方法, 如果Activity的onCreate中存在add Fragment操作,则会再次add一次该Fragment,造成该Activity中FragmentManager添加了多个相同的Fragment,造成也面显示覆盖的问题。

解决方案:

private int currentIndex = 0;
private Fragment currentFragment = new Fragment();
private Fragment fagment1 = new MyFragment1();
private Fragment fagment2 = new MyFragment2();

在onCreate()方法中判断savedInstanceState状态,reCreate()后savedInstanceState不为空,
通过getSupportFragmentManager().findFragmentByTag(),获取之前add过的fragment,
避免造成重复add fragment,savedInstanceState == null时调用的是原来onCreate()中的方法。


if (savedInstanceState != null) {
    fagment1 = getSupportFragmentManager().findFragmentByTag("tag1");
    fagment2 = getSupportFragmentManager().findFragmentByTag("tag2");
    //记录当前显示的时哪个fragment
    int tabId = savedInstanceState.getInt("currentIndex");
    if (tabId == 0) {
        switchFragment(fagment1).commit();
    } else {
        switchFragment(fagment2).commit();
    }
} else {
    switchFragment(investmentFragment).commit();
}



private FragmentTransaction switchFragment(Fragment targetFragment) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    if (!targetFragment.isAdded()) {
        if (currentFragment != null) {
            transaction.hide(currentFragment);
        }
        String tag = targetFragment.getClass().getName();
        transaction.add(R.id.fragment, targetFragment, tag);
    } else {
        transaction.hide(currentFragment).show(targetFragment);
    }
    currentFragment = targetFragment;
    return transaction;
}


public void onTabClick(View view) {
     switch (view.getId()) {
          case R.id.tab1:
               currentIndex = 0;
               switchFragment(fagment1).commit();
               break;
          case R.id.tab2:
               currentIndex = 1;
               switchFragment(fagment2).commit();
               break;
          default:
               break;
            
     }

 }


@Override
public void onSaveInstanceState(Bundle outState) {
   super.onSaveInstanceState(outState);
   outState.putInt("currentIndex", currentIndex);
}





 
### 解决MySQL数据库数据显示混乱问题 在处理MySQL数据库显示混乱问题,主要关注的是字符编码设置以及数据类型的正确使用。以下是具体的解决方案: #### 1. 设置正确的字符集 为了防止乱码现象的发生,在创建数据库和表结构应指定合适的字符集。通常推荐使用`utf8mb4`作为默认字符集,因为它能够支持更广泛的字符范围。 ```sql CREATE DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 对于已经存在的数据库,则可以通过修改其配置文件(`my.cnf`)中的相应部分来更改全局字符集设定[^4]。 #### 2. 修改现有表的字符集 如果遇到特定表内存在乱码的情况,可以直接对该表执行如下语句调整其字符集属性: ```sql ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 这一步骤同样适用于单列级别的字符集转换需求。 #### 3. 处理日期间字段格式化输出 针对日期间类别的字段可能出现的格式不一致情况,利用内置函数`DATE_FORMAT()`可以帮助实现统一化的展示效果。例如: ```sql SELECT DATE_FORMAT(date_column, '%Y-%m-%d') AS formatted_date FROM your_table; ``` 此方法特别适合于那些由外部导入且原始格式各异的间戳数据[^3]。 #### 4. 验证并清理异常记录 确保所有录入到系统的数据都经过严格验证,特别是涉及到跨平台传输的数据项。对于不符合预期模式的内容应当单独标记出来并与源端沟通核实后再做进一步处理。 通过上述措施可以有效改善MySQL数据库内的数据显示质量,提高查询结果的一致性和可读性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值