当我更改仿真器或电话上的方向时,片段会再加载一次。如果将设备旋转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生命周期的“正常”行为。当您翻转手机/屏幕时,将执行方向更改,其结果是重新进行活动。有一些解决方案:第一个是在清单文件中禁用方向,但这可能不是您正在寻找的解决方案!第二个是检查是否已添加片段。您可以制作类似:
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生命周期如何用于活动/片段。干杯
当活动方向改变时,它将再次调用onCreate()
,并且您放入其中的片段也将被重新创建。在这种情况下,您应该仅在活动的首次加载时创建片段。然后在下一次加载时获取保存的片段实例。使用tag
作为Fragment
键。