为什么我应该将上下文向下转换为接口的一个实例?
why should i downcast the context as an instance of the interface?
我刚开始在 Android 上学习片段 API。
我只想将消息发送回我的包含 activity(我做到了)。现在我想澄清一个关于向下转型的误解。
这是我的片段:
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 class 与我的 FragmentListener 接口有何关系?
我发现这与我对向下转型的了解相矛盾(向下转型是转型到子类型,向下转型到继承树。)
Context
和 FragmentListener
这两种类型是不相关的。但是,Context
的子类可能会实现 FragmentListener
接口。您的 onAttach()
方法检查这实际上是正在发生的事情并进行向下转换,因此 FragmentListener
功能可通过 mListener
成员字段使用。
任何附加 DetailFragment
实例的 Context
(很可能是 Activity
)将需要实现 DetailFragment.FragmentListener
以避免 AssertionError
在 运行时间。
我刚开始在 Android 上学习片段 API。 我只想将消息发送回我的包含 activity(我做到了)。现在我想澄清一个关于向下转型的误解。
这是我的片段:
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 class 与我的 FragmentListener 接口有何关系?
我发现这与我对向下转型的了解相矛盾(向下转型是转型到子类型,向下转型到继承树。)
Context
和 FragmentListener
这两种类型是不相关的。但是,Context
的子类可能会实现 FragmentListener
接口。您的 onAttach()
方法检查这实际上是正在发生的事情并进行向下转换,因此 FragmentListener
功能可通过 mListener
成员字段使用。
任何附加 DetailFragment
实例的 Context
(很可能是 Activity
)将需要实现 DetailFragment.FragmentListener
以避免 AssertionError
在 运行时间。