onAttach(Activity)弃用:我可以检查活动是否实现callback接口

在API 23之前,我使用Fragment的onAttach方法来获取侦听器实例,然后在onDetach中清除引用。 例如:

@Override public void onAttach(Activity activity) { super.onAttach(activity); mListener = null; try { mListener = (SellFragmentListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement SellFragmentListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } 

在onAttach(上下文环境)中执行相同的检查是否安全?还是有更好的方法来获取持有者活动实例?

Solutions Collecting From Web of "onAttach(Activity)弃用:我可以检查活动是否实现callback接口"

检查源代码:

 /** * Called when a fragment is first attached to its context. * {@link #onCreate(Bundle)} will be called after this. */ public void onAttach(Context context) { mCalled = true; final Activity hostActivity = mHost == null ? null : mHost.getActivity(); if (hostActivity != null) { mCalled = false; onAttach(hostActivity); } } /** * @deprecated Use {@link #onAttach(Context)} instead. */ @Deprecated public void onAttach(Activity activity) { mCalled = true; } 

所以onAttach(Activity activity)onAttach(Context context)调用,如果有主机活动的话。 您可以安全地使用onAttach(Activity activity)

那么,什么是不赞成onAttach(Activity activity); 方法,但整个stream程仍然存在。 所以你可能什么都不做,就像onAttach(Activity activity); 将仍然支持足够长的时间。

我从来没有使用onAttach(Context context) ,但我认为你的代码基本上是好的。 所以这里是我的build议,使用你的代码:

 public void onAttach (Context context) { super.onAttach(context); try { Activity activity = (Activity) context; mListener = (SellFragmentListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement SellFragmentListener"); } } 

主要区别在于我可以通过typescontext来获取Activity。 这是因为Context可以传播到活动的子类。

另外一个问题,API 23离我们现在还有很远的距离。 如果你担心,使用构build杂注(静态构build)可能是一个不错的select。

如Zsolt Mester的答案所示, onAttach(Activity activity)已被弃用,以onAttach(Context context)onAttach(Context context) 。 因此,所有你需要做的就是检查以确保上下文是一个活动。

在Android Studio中,如果转到“ 文件”>“新build”>“片段” ,则可以获取包含正确语法的自动生成的代码。

 import android.support.v4.app.Fragment; ... public class MyFragment extends Fragment { private OnFragmentInteractionListener mListener; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // inflate fragment layout return inflater.inflate(R.layout.fragment_myfragment, container, false); } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } public interface OnFragmentInteractionListener { // TODO: Update argument type and name void onFragmentInteraction(Uri uri); } } 

笔记

  • 由于父活动必须实现我们的OnFragmentInteractionListener (任意命名的接口),检查(context instanceof OnFragmentInteractionListener)确保上下文实际上是活动。

  • 请注意,我们正在使用支持库。 否则onAttach(Context context)不会被预先API 23版本的Android调用。

也可以看看

  • 创build和使用片段
  • AndroidFragment onAttach()已弃用

我面临同样的情况。 我已经经历了各种职位,最后在onCreate()块fragment.Till现在我没有遇到任何问题,我认为这不会是一个问题,onCreate在生命周期中onAttach后立即调用。

  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { listnener = (TilesOnClickListnener)getActivity(); } catch (ClassCastException e) { throw new ClassCastException(getActivity().toString() + " must implement OnArticleSelectedListener"); } } 
  public class MainActivity extends AppCompatActivity implements topsection.TopSectionListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void createMeme(String top, String bottom){ bottomsection fragmentbottom = (bottomsection) getSupportFragmentManager().findFragmentById(R.id.fragment2); fragmentbottom.setMemeText(top, bottom); } } 

我使用本地Fragment而不是支持库中的 Fragment 。 我将两个onAttach()方法放在我的代码中,并在运行不同SDK版本的设备上进行了一些debugging。 我find:

SDK 22及以下版本 – 只有onAttach(Activity)被调用。 实际上并不奇怪,因为onAttach(Context)仅在SDK 23中引入。

SDK 23及以上版本onAttach(Context)首先被调用,然后 onAttach(Activity) 。 (这与@Zsolt Mester在本文的另一个答案中对源代码所说的内容是一致的。)

由于minSdkVersion为我的应用程序低于23我只是决定完全省略onAttach(Context)并简单地将@SuppressWarnings("deprecation")注释添加到我现有的onAttach(Activity)方法。