为什么我应该将上下文下调为接口的实例?

时间:2018-06-22 21:20:18

标签: android android-fragments android-context downcast

我刚刚开始学习Android上的片段API。 我只想将一条消息发送回我包含的活动(我做到了)。现在,我想消除对垂头丧气的误解。

这是我的片段:

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

public class DetailFragment extends Fragment {

private EditText textFirstName, textLastName, textAge;
private FragmentListener mListener;

public DetailFragment() {
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    if (!(context instanceof FragmentListener)) throw new AssertionError();
    mListener = (FragmentListener) context;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_detail, container, false);

    textFirstName = (EditText) rootView.findViewById(R.id.textFirstName);
    textLastName = (EditText) rootView.findViewById(R.id.textLastName);
    textAge = (EditText) rootView.findViewById(R.id.textAge);

    Button doneButton = (Button) rootView.findViewById(R.id.done_button);
    doneButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            done();
        }
    });
    return rootView;
}

private void done() {
    if (mListener == null) {
        throw new AssertionError();
    }

    String firstName = textFirstName.getText().toString();
    String lastName = textLastName.getText().toString();
    int age = Integer.valueOf(textAge.getText().toString());

    mListener.onFragmentFinish(firstName, lastName, age);
}

public interface FragmentListener {
    void onFragmentFinish(String firstName, String lastName, int age);
}

}

我不明白这里的垂头丧气:

mListener = (FragmentListener) context;

Context类如何与我的FragmentListener接口相关?

我发现这与我对向下转换的知识相矛盾(向下转换是转换为子类型,向下转换为继承树)

1 个答案:

答案 0 :(得分:1)

ContextFragmentListener这两种类型无关。但是,Context的子类可能实现FragmentListener接口。您的onAttach()方法检查实际上是什么,然后进行向下转换,以便可以通过FragmentListener成员字段使用mListener功能。

任何附有Context实例的Activity(很可能是DetailFragment)都需要实现DetailFragment.FragmentListener以避免在运行时出现AssertionError