繁体   English   中英

Android Studio 中的接口如何工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM