[英]How does an interface in Android Studio work?
因此,我阅读了很多关于在 Android 应用程序中创建接口的内容,但有一种方法我不太了解。 我会将我的问题包含在代码中,以便您可以直接看到它们。 请对我温柔一点,我是一个初学者,真的很想理解它(在这个问题上坐了三个小时),但我就是不明白。 :)
施工情况如下:
我有MainActivity.java
class 和MessageFragment.java
ZA2F2ED4F9EBC2CBB4C2A。 所以基本上我有一个带有“纯文本”视图和一个按钮的片段。 当用户在文本框中输入内容并单击按钮时,输入应该从片段传输到MainActivity
,并且应该显示在屏幕上。 MessageFragment.java
看起来像这样(对不起,代码很长,但我认为您可能必须看到所有内容):
package and import...
public class MessageFragment extends Fragment {
private EditText editText;
private Button button;
OnMessageReadListener messageReadListener;
public MessageFragment() {
}
public interface OnMessageReadListener{
public void onMessageRead(String message);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_message, container, false);
editText = view.findViewById(R.id.text_message);
button = view.findViewById(R.id.bn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = editText.getText().toString();
messageReadListener.onMessageRead(message);
???QUESTION 1??? What is the last function doing? It looks to me that it calls the method
onMessageRead() but this method doesn't contain any activity in it's definition.
}
});
return view;
}
public void onAttach(Context context){
super.onAttach(context);
Activity activity = (Activity) context;
try{
messageReadListener = (OnMessageReadListener) activity;
}catch (ClassCastException e){
throw new ClassCastException((activity.toString()+" must override OnMessageRead..."));
}
}
???QUESTION 2??? What is the whole onAttach method doing? I read things like "Called when
a fragment is first attached to it's context" but I don't understand this. What is the context here?
And what does the line messageReadListener = (OnMessageReadListener) activity; do?
Also, why does this method come before the "onCreateView" method (it seemed like it while debugging)?
}
MainActivity.jave
看起来像这样:
package and import...
public class MainActivity extends AppCompatActivity implements MessageFragment.OnMessageReadListener{
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(findViewById(R.id.fragment_container) != null)
{
if (savedInstanceState != null){
return;
}
MessageFragment messageFragment = new MessageFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, messageFragment, null);
fragmentTransaction.commit();
}
}
@Override
public void onMessageRead(String message) {
textView = findViewById(R.id.txt_display_message);
textView.setText(message);
}
???QUESTION 3??? I really don't get it, when this last method onMessageRead() get's called here.
I know from debugging, that it get's called after I click the button in the fragment, but why?
}
编辑:首先,非常感谢你们的努力:) 所以,我想我明白了一点,但如果有人可以批准或不批准以下内容,那就太好了:
基本上onAttach()
方法是片段和活动之间的链接。 此方法确保我的片段( messageReadListener
)中有一个变量,其中 MainActivity 被“存储”。 所以片段中的onCreateView()
方法在onAttach()
方法之后被处理。 因此,当片段中的onClickListener
被触发时,行messageReadListener.onMessageRead(message);
基本上是在说MainActivity.onMessageRead(message);
因为 MainActivity 已经“存储”在变量messageReadListener
中。 而这也是触发MainActivity中的onMessageRead()
方法的原因。
我仍然认为我在某个地方有错误,因为我为什么不写这个MainActivity.onMessageRead(message);
立即地? 而我为什么不直接在MainActivity中定义onMessageRead()
方法,去掉fragment中的接口呢?
我喜欢你的问题,我将以简化的方式向你解释。 就像向不了解 Java 的人解释一样。
首先,“类”是一个蓝图,例如你想建一所房子。 首先,您需要一个建造房屋的计划,在 Java 中,“类”是计划,而成品(在这种情况下是房屋)是“对象”。 回到您的代码,“MainActivity”是您的用户在打开应用程序时在手机屏幕上看到的内容,它是界面的一部分。 例如,假设您构建了一个新闻应用程序。 当用户打开新闻应用程序时,他们看到的第一件事通常是“新闻”,即您的“MainActivity”。 和“扩展”,例如“世界新闻”。 这意味着“世界新闻”是“MainActivity”的延续,它是 inheritance。 在现实生活中,我相信您有时会听到人们说您看起来像您的妈妈或爸爸。 “MainActivity”和“extends”也发生了同样的事情。 “implements”也是“MainActivity”的延续。 “实现”的主要原因是您想要构建更清洁的代码。
现实世界中的“覆盖”与绕过相同。 在 Java 中,这意味着“MainActivity”仍在继续,但它的继承者现在是自定义的,尽管它们从其主要父“MainActivity”继承了它们的特征、属性甚至行为。 他们现在是独立的,就像“新闻应用程序”一样。 'News',可以有子'World News'、'Motoring'、'Politics'、'Finance'和'Weather'。 所有这些都是新闻,它们继承自“新闻”。 某些应用程序通常有多个“MainActivity”,具体取决于应用程序的大小。 简单来说,在我们的示例中,界面是应用程序“新闻应用程序”的表面,用户在使用该应用程序时会体验到它。 这是一个更简化的解释。
这是一个简单的例子:
@Override
public void onClick(View v) {
String enteredText;
enteredText = mEditText.getText().toString();
mTextView.setVisibility(View.VISIBLE);
mTextView.setText(enteredText);
} });
您必须在片段中创建函数setOnMessageReadListener
并在 Activity 中设置它
public void setOnMessageReadListener(OnMessageReadListener messageReadListener){
this.messageReadListener = messageReadListener;
}
问题 1 -最后的 function 在做什么? 在我看来,它调用了 onMessageRead() 方法,但该方法的定义中不包含任何活动。
最后一个 function 是对您的侦听器实现的方法 onMessageRead() 的调用。
您已经声明了一个类型为 OnMessageReadListener 的变量,即它实现了 onMessageRead (String message) 方法。
OnMessageReadListener messageReadListener;
....
public interface OnMessageReadListener{
public void onMessageRead(String message);
}
问题 2 -整个 onAttach 方法在做什么? 我读过诸如“在片段首次附加到其上下文时调用”之类的内容,但我不明白这一点。 这里的上下文是什么?
这有点令人困惑,但归结为android 活动生命周期。
Android 系统在活动进入新状态时调用一些回调,以允许开发人员对 state 更改采取行动。
在这种情况下,当片段附加到您的 Activity 时,Android 系统会调用 OnAttach 方法。
Activity activity = (Activity) context;
try{
messageReadListener = (OnMessageReadListener) activity;
}catch (ClassCastException e){
throw new ClassCastException();
}
如您所见,这里发生的事情是开发人员告诉 Android “当您将我的片段附加到 cointainer 活动时,将 messageReadListener 变量设置为活动本身,它必须实现 OnMessageReadListener 接口,否则将引发 ClassCastException”。
问题 3 -当最后一个方法 onMessageRead() 在这里调用时,我真的不明白。
它在您的问题 1 代码上调用。
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = editText.getText().toString();
messageReadListener.onMessageRead(message);
}
});
那么,这里发生了什么?
当您单击片段中的按钮时,开发人员只是使用接口允许该片段向主要活动发送消息。
在这里你说“我有一个变量,它包含任何实现 OnMessageReadListener 接口的东西”。
然后在主 Activity 上通过创建方法 onMessageRead() 来实现该接口。
当 Adroid 将片段附加到主活动时,您将该活动分配给片段的变量messageReadListener ,在 OnAttach 调用上。
之后,您只需使用该变量在 OnClik 按钮事件中调用主活动上的 onMessageRead() 方法。
这允许您的片段和主要活动沟通untangled ,即不持有一个,对另一个的引用。
编辑:问题 4我仍然认为我在某处有错误,因为我为什么不写这个 MainActivity.onMessageRead(message); 立即地? 而我为什么不直接在MainActivity中定义onMessageRead()方法,去掉fragment中的接口呢?
你可以这样做,但这意味着这些类会被tangled 。 那就是您需要在片段上引用 MainActivity。
通过该界面,您可以在任何活动中使用您的片段。 你只需要它来实现接口,在任何新的活动上使用它。
因此,重用您的代码更容易,并且在您希望使用 Fragment 的任何活动上实现该接口会更干净,而不是获取您希望使用 Fragment 的每个活动的实例,然后检查什么是来电者之一。
对接口进行编码被认为是 Object 面向编程的良好实践。
Jt 超级简单,如果你不需要知道什么是接口,请转义:接口就像名字所说的那样,两个类之间的 class 所以它们不必直接相互通信 为什么? 因为您可能仍然不知道要如何处理触发接口 function 的事件
问题1:它不需要里面的activity,activity应该实现这个接口,所以当用户点击按钮时,这个activity告诉接口方法做什么都会被执行
我就停在这里,如果你理解第一个,我会回答 rest
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.