【问题标题】:Activity is an instance of MainFragmentListener, is it true?Activity是MainFragmentListener的一个实例,是真的吗?
【发布时间】:2018-05-27 13:38:30
【问题描述】:

我想知道,这怎么可能。
我有带有监听器的 MainActivty 和 MainFragment:MainFragmentListener。
当然,我在 MainActivity 中将此侦听器实现为接口。
现在我试图理解这一点:

if (context instanceof MainFragmentListener)

总是如此,这怎么可能? MainActivity 不是 MainFragmentListener 的实例。
MainFragmentListener 是一个公正的接口,而不是对象!

主片段:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof MainFragmentListener) {
        mListener = (MainFragment.MainFragmentListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

public interface MainFragmentListener {
    void xx();
    void yy();
}

活动:

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener,
        MainFragment.MainFragmentListener{  

public void xx(){
     abc
 };
public void yy(){
abc2
 };

}

【问题讨论】:

  • instanceof 检查所有继承的类型,而不仅仅是类。
  • 反正Activity在层次结构中比fragment接口高
  • 另外context在这里只能是Activity,不能是Fragment。您可以在 Activity 上定义任意数量的接口。 instanceof 不在乎
  • 我编辑了,这里当然是Activity,所以Activity在层次结构中比Fragment接口高
  • 在哪里编写接口定义并不重要。它可能在单独的MainFragmentListener.java 文件中...

标签: java android oop inheritance instanceof


【解决方案1】:

这是因为instanceof 也会检查一个类是否实现了一个接口。您可以阅读documentation

instanceof 运算符将对象与指定类型进行比较。你 可以用它来测试一个对象是否是一个类的实例,一个实例 一个子类,或一个实现特定的类的实例 界面。

虽然我认为instanceof 运算符名称有点误导。

【讨论】:

    【解决方案2】:

    Activity在层次结构中高于片段接口

    所以?假设 Fragment 被分配给 MainActivity,那么 context instanceof 将是 true

    • 类本身 - MainActivity。
    • 您在该类上定义的任何接口(无论接口的定义写在哪里)
      • NavigationView.OnNavigationItemSelectedListener
      • MainFragment.MainFragmentListener

    以及每个类和接口in the hierarchy

    public class AppCompatActivity extends FragmentActivity implements AppCompatCallback, TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider

    java.lang.Object
       ↳    android.content.Context
           ↳    android.content.ContextWrapper
               ↳    android.view.ContextThemeWrapper
                   ↳    android.app.Activity
                       ↳    android.support.v4.app.FragmentActivity
    

    【讨论】:

      猜你喜欢
      • 2013-12-26
      • 2013-08-27
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多