【问题标题】:Why an activity object is casted to an interface in Android?为什么 Activity 对象被强制转换为 Android 中的接口?
【发布时间】:2017-07-11 12:23:57
【问题描述】:

在以下链接https://github.com/iPaulPro/Android-ItemTouchHelper-Demo/blob/master/app/src/main/java/co/paulburke/android/itemtouchhelperdemo/MainFragment.java 中,Activity 对象被强制转换为名为 OnListItemClickListener 的内部接口。

mItemClickListener.onListItemClick(position);

MainFragment 类的完整源码如下:

public class MainFragment extends ListFragment {

    public interface OnListItemClickListener {
        void onListItemClick(int position);
    }

    private OnListItemClickListener mItemClickListener;

    public MainFragment() {
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        mItemClickListener = (OnListItemClickListener) activity;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        final String[] items = getResources().getStringArray(R.array.main_items);
        final ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(),
                android.R.layout.simple_list_item_1, items);
        setListAdapter(adapter);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        mItemClickListener.onListItemClick(position);
    }
}

为什么要将活动对象强制转换为接口?

stackoverflow How is it possible to cast an Android Activity to an interface? 有类似问题,但对我来说并不满意,它没有回复我的问题。

【问题讨论】:

  • 查看添加MainFragment 的Activity。
  • 你为什么不问问写这段代码的人呢?只有他自己知道。
  • @MuratK。我更新了我的问题。我想知道为什么将活动投射到界面..
  • 面向对象的设计说“程序是接口而不是实现”——如果你理解了,你就会理解这个设计

标签: java android android-activity interface casting


【解决方案1】:

要扩展 @CommonsWare 的答案,了解为什么必须将其转换为 OnListItemClickListenerFragmentonAttach 生命周期方法接受任何 Activity - 并且 Activity 没有默认实现 MainFragment.OnListItemClickListener

所以编译器不知道这一点,但你知道 MainActivity 已经实现了它,并且通过强制转换你告诉编译器 MainActivity implements MainFragment.OnListItemClickListener

【讨论】:

    【解决方案2】:

    这个接口没有在代码中的任何地方实现或者我看不到它

    this line:

    public class MainActivity extends ActionBarActivity implements MainFragment.OnListItemClickListener {
    

    但我看不到此方法的任何其他实现..

    these lines:

    @Override
    public void onListItemClick(int position) {
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new RecyclerListFragment();
                break;
    
            case 1:
                fragment = new RecyclerGridFragment();
                break;
        }
    
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.content, fragment)
                .addToBackStack(null)
                .commit();
    }
    

    为什么要将活动对象转换为接口?

    这是契约模式的典型实现。该片段要求其托管活动实现某个接口。这样,片段就不会关心承载它的特定活动类。

    【讨论】:

      【解决方案3】:

      你必须让你的活动implements MainFragment.OnListItemClickListener

      另外,在你的Activity中,你需要实现函数void onListItemClick(int position)

      【讨论】:

        猜你喜欢
        • 2014-01-16
        • 2014-11-22
        • 2015-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-23
        相关资源
        最近更新 更多