当 class 中没有使用 static 关键字时,什么会生成 "cannot be referenced from static context"?

What generates "cannot be referenced from static context" when static keyword is not used in the class?

我收到以下代码的 Non-static method 'getSupportFragmentManager()' cannot be referenced from static context 错误:

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentActivity;
.
.
.
public class MedicalInformationFragment extends Fragment implements FragmentNameProvider, ConfirmDialogFragment.ConfirmDialogListener{
.
.
.
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG, "Entered: onCreate");
    first = true;
    if(getArguments() != null) {
        petId = getArguments().getInt(PET_ID_KEY);
        Log.d(TAG, "Pet ID is: " + petId);
        sMedicalInformationViewModel = ViewModelProviders.of(this).get(MedicalInformationViewModel.class);
        FragmentManager fm = FragmentActivity.getSupportFragmentManager();
        if(fm != null) {
            thisFragment = fm.findFragmentById(R.id.fragment_container);
            Log.d(TAG, "thisFragment is: " + thisFragment);
        }else{
            Log.d(TAG, "Error: fm == null");
        }
    }else{
        Log.d(TAG, "Error: getArguments() == null");
    }
}
.
.
.
}

但是,关键字 'static' 从未在 class 的任何地方使用。

我正在关注 API 使用 getSupportFragmentManager(). I had used getFragmentManager 但被告知 android.app.Fragmentdeprecated in API level 28.and to use the Support Library Fragment for consistent behavior across all devices and access to Lifecycle,但发现这个 package is part of the Android support library which is no longer maintained. The support library has been superseded by AndroidX which is part of Jetpack.

所以,我在这里,遵循我认为是 Android API 的指令,并得到一个我不明白的错误。如果不使用 'static' 关键字,会产生什么错误?

您正在 class (FragmentActivity) 而不是实例调用实例方法 (getSupportFragmentManager())。 "static context" 是 FragmentActivity.

要为您的 Fragment 获得 FragmentManager,请尝试 getParentFragmentManager():

FragmentManager fm = getParentFragmentManager();

如果该方法似乎不存在,则说明您使用的是该方法存在之前的旧版本 AndroidX 库。在这种情况下,使用 getFragmentManager():

FragmentManager fm = getFragmentManager();