Активность является экземпляром MainFragmentListener, это правда? - PullRequest
0 голосов
/ 27 мая 2018

Мне интересно, как это возможно.
У меня есть MainActivty и MainFragment со слушателем: MainFragmentListener.
Конечно, я реализовал этот слушатель как интерфейс в MainActivity.
Теперь я пытаюсь понятьВот это:

if (context instanceof MainFragmentListener)

Это всегда так, как это возможно?MainActivity не является экземпляром MainFragmentListener.
MainFragmentListener - это просто интерфейс, а не объект!

MainFragment:

@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
 };

}

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Это потому, что instanceof также проверяет, реализует ли класс интерфейс.Вы можете прочитать документацию :

Оператор instanceof сравнивает объект с указанным типом.Вы можете использовать его, чтобы проверить, является ли объект экземпляром класса, экземпляром подкласса или экземпляром класса, который реализует определенный интерфейс.

Хотя я думаю, что instanceofимя оператора немного вводит в заблуждение.

0 голосов
/ 27 мая 2018

Активность выше в иерархии, чем интерфейс фрагмента

Так?Предполагая, что Fragment назначен для MainActivity, тогда context instanceof будет истинным для

  • Сам класс - MainActivity.
  • Любой интерфейс, который вы определили в этом классе (независимо от того, где написано определение интерфейса)
    • NavigationView.OnNavigationItemSelectedListener
    • MainFragment.MainFragmentListener

а также каждый класс и интерфейс в иерархии

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
...