片段在方向改变时加载多次

问题描述 投票:0回答:2

当我更改仿真器或电话上的方向时,片段会再加载一次。如果将设备旋转3次,则片段将在最后旋转后加载3次,如果将设备旋转5次,则片段将在最后旋转后加载5次。

主要活动

...
FragmentOne fragment = new FragmentOne();

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.main_container, fragmnet);
transaction.commit();

我在片段中唯一拥有的是日志,没有什么东西可以导致片段多次加载。FragmentOne

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        Log.d(TAG, "onCreateView: ");
        return inflater.inflate(R.layout.fragment_fragment_one, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Log.d(TAG, "onViewCreated: ");
    }

这里是旋转一圈后的日志副本,请注意,一次更改方向多次调用onCreateView。

2020-04-13 01:23:07.396 10857-10857/com.example.myapplication D/MYFragmentOne: onCreate: 
2020-04-13 01:23:07.396 10857-10857/com.example.myapplication D/MYFragmentOne: onCreate: 
2020-04-13 01:23:07.418 10857-10857/com.example.myapplication D/MYMainActivity: onCreate: 
2020-04-13 01:23:07.423 10857-10857/com.example.myapplication D/MYFragmentOne: onCreateView: 
2020-04-13 01:23:07.429 10857-10857/com.example.myapplication D/MYFragmentOne: onViewCreated: 
2020-04-13 01:23:07.429 10857-10857/com.example.myapplication D/MYFragmentOne: onCreateView: 
2020-04-13 01:23:07.431 10857-10857/com.example.myapplication D/MYFragmentOne: onViewCreated: 
2020-04-13 01:23:07.431 10857-10857/com.example.myapplication D/MYFragmentOne: onCreate: 
2020-04-13 01:23:07.431 10857-10857/com.example.myapplication D/MYFragmentOne: onCreateView: 
2020-04-13 01:23:07.433 10857-10857/com.example.myapplication D/MYFragmentOne: onViewCreated:



App details
compileSdkVersion 29
buildToolsVersion "29.0.2"
applicationId "com.example.myapplication"
minSdkVersion 29
targetSdkVersion 29

什么会导致片段在方向改变时加载如此多次?

这里是指向我的github的链接Link

android android-fragments screen-orientation
2个回答
0
投票

之所以发生,是因为这是android生命周期的“正常”行为。当您翻转手机/屏幕时,将执行方向更改,其结果是重新进行活动。有一些解决方案:第一个是在清单文件中禁用方向,但这可能不是您正在寻找的解决方案!第二个是检查是否已添加片段。您可以制作类似:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MYMainActivity";
    private FragmentOne fragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate: ");
        if (fragment == null) {
        fragment = new FragmentOne();

        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();


        transaction.add(R.id.main_container, fragment);
        transaction.commit();
        }
    }
}

在这种情况下,您不会在每次重新创建活动时添加多个片段。更好的是,您可以从片段管理器检查是否已经从TAG添加了片段,只需在transaction.add函数中添加id并检查是否存在!

希望它对您有帮助。但是无论如何,只是必须阅读android生命周期如何用于活动/片段。干杯


0
投票

当活动方向改变时,它将再次调用onCreate(),并且您放入其中的片段也将被重新创建。在这种情况下,您应该仅在活动的首次加载时创建片段。然后在下一次加载时获取保存的片段实例。使用tag作为Fragment键。

© www.soinside.com 2019 - 2024. All rights reserved.