Android Fragment onAttach() deprecated

匿名 (未验证) 提交于 2019-12-03 01:39:01

问题:

I have updated my app to use the latest support library (version 23.0.0), I've found out that they deprecated the onAttach() function of the Fragment class.

Instead of:

onAttach (Activity activity)

It's now:

onAttach (Context context)

As my app uses the activity passed before deprecation, a possible solution i think is:

@Override public void onAttach(Context context) {     super.onAttach(context);     activity = getActivity(); }

Would that be the correct way to do it?

UPDATE:

If i run a device with API lower than 23, the new onAttach() is not even being called. I hope that this is not what they intended to do!

UPDATE 2:

Issue has been resolved with the latest updates to the SDK.

I have tested on my API 22 device and onAttach(Context) is being called.

Click here to follow the bug report I've opened a couple of weeks ago and the answers from the guys at Google.

回答1:

Activity is a context so if you can simply check the context is an Activity and cast it if necessary.

@Override public void onAttach(Context context) {     super.onAttach(context);      Activity a;      if (context instanceof Activity){         a=(Activity) context;     }  }

Update: Some are claiming that the new Context override is never called. I have done some tests and cannot find a scenario where this is true and according to the source code, it should never be true. In all cases I tested, both pre and post SDK23, both the Activity and the Context versions of onAttach were called. If you can find a scenario where this is not the case, I would suggest you create a sample project illustrating the issue and report it to the Android team.

Update 2: I only ever use the Android Support Library fragments as bugs get fixed faster there. It seems the above issue where the overrides do not get called correctly only comes to light if you use the framework fragments.



回答2:

If you use the the framework fragments and the SDK version of the device is lower than 23, OnAttach(Context context) wouldn't be called.

I use support fragments instead, so deprecation is fixed and onAttach(Context context) always gets called.



回答3:

This is another great change from Google ... The suggested modification: replace onAttach(Activity activity) with onAttach(Context context) crashed my apps on older APIs since onAttach(Context context) will not be called on native fragments.

I am using the native fragments (android.app.Fragment) so I had to do the following to make it work again on older APIs (< 23).

Here is what I did:

@Override public void onAttach(Context context) {     super.onAttach(context);      // Code here }  @SuppressWarnings("deprecation") @Override public void onAttach(Activity activity) {     super.onAttach(activity);      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {         // Code here     } }


回答4:

Currently from the onAttach Fragment code, it is not clear if the Context is the current activity: Source Code

public void onAttach(Context context) {     mCalled = true;     final Activity hostActivity = mHost == null ? null : mHost.getActivity();     if (hostActivity != null) {         mCalled = false;         onAttach(hostActivity);     } }

If you will take a look at getActivity you will see the same call

/**  * Return the Activity this fragment is currently associated with.  */ final public Activity getActivity() {     return mHost == null ? null : mHost.getActivity(); }

So If you want to be sure that you are getting the Activity then use getActivity() (in onAttach in your Fragment) but don't forget to check for null because if mHost is null your activity will be null



回答5:

@Override public void onAttach(Context context) {     super.onAttach(context);      Activity activity = context instanceof Activity ? (Activity) context : null; }


回答6:

Download newest Support library with the sdk manager and include

compile 'com.android.support:appcompat-v7:23.1.1'

in gradle.app and set compile version to api 23



回答7:

The answer below is related to this deprecation warning occurring in the Fragments tutorial on the Android developer website and may not be related to the posts above.

I used this code on the tutorial lesson and it did worked.

public void onAttach(Context context){     super.onAttach(context);      Activity activity = getActivity();

I was worried that activity maybe null as what the documentation states.

getActivity

FragmentActivity getActivity () Return the FragmentActivity

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!