由于不推荐使用Android getFragmentManager()API,是否还有其他选择?

时间:2018-08-08 02:07:11

标签: java android

FragmentManager已过时。有替代方法还是我现在该怎么办?

 PlaceAutocompleteFragment autocompleteFragment = (PlaceAutocompleteFragment) getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);
        autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
            @Override
            public void onPlaceSelected(Place place) {
                // TODO: Get info about the selected place.
                destination = place.getName().toString();
                destinationLatLng = place.getLatLng();
            }
            @Override
            public void onError(Status status) {
                // TODO: Handle the error.
            }
        });

deprecation strike image

13 个答案:

答案 0 :(得分:8)

此方法已在API级别28中弃用。

使用FragmentActivity.getSupportFragmentManager()

答案 1 :(得分:8)

我使用parentFragmentManager代替了fragmentManager。 (如果您使用的是 androidx Fragment。)

https://developer.android.com/jetpack/androidx/releases/fragment#1.2.0

getFragmentManager()弃用getFragmentManager()requireFragmentManager()上的Fragment个方法已被弃用, 用单个getParentFragmentManager()方法代替, 返回将FragmentManager添加到的非null Fragment(您可以 使用isAdded()确定是否可以安全通话)。

答案 2 :(得分:5)

您应该改用Android支持库中的Fragment类。

android.app.Fragment在API级别28中已弃用。 使用支持库片段在所有设备上实现一致的行为并访问生命周期。

改为使用android.support.v4.app.Fragment

答案 3 :(得分:5)

现在,我在 Kotlin 中使用

val fragmentManager = this@className.parentFragmentManager

好吧,如果您仍然使用 Java,我认为代码是

FragmentManager manager = this.getParentFragmentManager();

希望我的回答能解决问题。

我建议您现在使用导航

答案 4 :(得分:3)

使用Support Library可以解决此问题。

根据documentation片段类已被弃用:

  

在API级别28中不推荐使用该类。使用支持库   片段,用于在所有设备上保持一致的行为并访问   生命周期。

答案 5 :(得分:3)

使用此

import android.support.v4.app.FragmentManager;

代替

import android.app.FragmentManager;

然后 使用此

FragmentManager manager = ((YourActivity) mContext).getSupportFragmentManager();

代替

 FragmentManager manager = ((YourActivity) mContext).getFragmentManager();

答案 6 :(得分:2)

由于问题有点笼统,因此这是已迁移到androidX的人们的解决方案。

请确保您的片段使用import部分中的androidX版本。也就是说,如果您使用的是DialogFragment(),请替换

import android.app.DialogFragment

import androidx.fragment.app.DialogFragment

然后fragmentManager show()对话框时,如果从另一个fragment启动,则不要更改它,但是如果是从Activity传递,则首先扩展活动从FragmentActivity(),然后通过supportFragmentManager

// kotlin
import androidx.fragment.app.FragmentActivity

class MyActivity: FragmentActivity() {
    ...
    val myDialog = MyDialog()
    myDialog.show(supportFragmentManager, TAG)
    ...
}

Althogh 如果您尚未迁移到support.v4,同样的步骤也适用于androidX。只是第一步,替换

import android.app.DialogFragment

使用

import android.support.v4.app.Fragment

答案 7 :(得分:2)

如果您使用AndroidX Fragment androidx.fragment.app.Fragment,则可以使用

getActivity().getSupportFragmentManager()

答案 8 :(得分:1)

对于Kotlin:

activity
    ?.supportFragmentManager
    ?. <whatever needs to come after that>

答案 9 :(得分:1)

如果要在 PreferenceFragment (特别是 android.preference.PreferenceFragment 而不是Support Preference库中的类)上显示DialogFragment,那么您将看到此内容警告。

大约在2018年6月,Google弃用了PreferenceFragment及其所有相关方法,例如getFragmentManager()。您可能已经知道getSupportFragmentManager()仍然不能在PreferenceFragment上使用,因为它是一个特殊的例外。

现在推荐的方法是使用AndroidX Jetpack库或“首选项支持”库中的 PreferenceFragmentCompat

implementation "androidx.preference:preference:1.0.0"

您可以在此处查看可用的版本:https://maven.google.com->搜索“首选项”

此处有更多信息:Android- deprecated method warning regarding PreferenceActivity


请注意,迁移到PreferenceFragmentCompat可能是一个漫长而艰巨的任务,尤其是如果您具有自定义的Preference类。更多信息:

答案 10 :(得分:0)

Xml:

   <fragment
            android:id="@+id/place_autocomplete_fragment"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:name="com.google.android.gms.location.places.ui.SupportPlaceAutocompleteFragment"
            />

活动:

    SupportPlaceAutocompleteFragment autocompleteFragment = (SupportPlaceAutocompleteFragment)
            getSupportFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);

答案 11 :(得分:0)

如果我对您的理解很好,getFragmentManager()已弃用

我们将使用getChildFragmentManager() 返回一个私有的FragmentManager,用于在此Fragment中放置和管理Fragment。

我们将使用getParentFragmentManager() 返回用于与与此片段活动相关联的片段进行交互的FragmentManager。

因此,如果您处理片段中的片段,则将使用第一个片段;如果您处理活动中的片段,则将使用第二个片段。

您可以在这里package androidx.fragment.app;

找到它们

答案 12 :(得分:0)

扩展 AppCompatActivity (默认情况下扩展 FragmentActivity ),然后您可以使用 getSupportFragmentManager(),它会返回 fragmentManager strong>。