为什么将活动对象转换为Android中的界面?

时间:2017-07-11 12:23:58

标签: java android android-activity interface casting

在以下链接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?也有类似的问题,但对我来说不满意,它不回复我的问题。

3 个答案:

答案 0 :(得分:1)

  

此接口未在代码中的任何位置实现,或者我看不到它

请参阅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();
}
  

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

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

答案 1 :(得分:1)

要扩展@CommonsWare,请回答为什么必须将其转换为OnListItemClickListeneronAttach的{​​{1}}生命周期方法接受任何Fragment - 并且Activity没有Activity作为默认值实施。

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

答案 2 :(得分:0)

您必须开展活动implements MainFragment.OnListItemClickListener

此外,在您的活动中,您将需要实现函数void onListItemClick(int position)