从片段调用活动使用接口,但是为什么呢?

时间:2019-01-20 09:07:59

标签: java android

您好,我现在是初学者,我想从片段中调用一个活动。 但是我发现最好的方法是在viewholder类内部创建一个接口。 我只是想知道为什么这样做。 最好对其进行清楚的解释。

2 个答案:

答案 0 :(得分:0)

您要问的是所谓的回调接口。

此接口的唯一目的是通知代码的其他部分已发生特定事件,并允许您响应该事件。

您应该已经在Android开发中经常看到这些类型的接口,例如,OnClickListener是用于检测何时“单击”视图的回调接口。

继续该示例,当您使用view.setOnClickListener(listener)时,实际上是将响应传递给View,并告诉它:“嘿,当您运行代码并到达您单击的部分时, ',也运行我的代码。”

因此,有了这个快速的解释,让我们回答您的问题。

首先,我想指出,从Fragment启动Activity的最好方法就是简单地在Fragment内调用startActivity()。无需使用界面或其他任何东西。

您之所以读到这是启动Activity的最好方法,是因为该Activity是从ViewHolder内部启动的。

在Android中,创建许多组件时都考虑到了重用。我的意思是RecyclerView

RecyclerView是用于显示可滚动列表或数据网格的组件。请注意,RecyclerView并非仅针对特定项目而设计,实际上它是一个足够灵活,强大的组件,几乎可以被任何开发人员用于任何项目。

它是如何做到的?通过使其自身具有功能,但没有一个功能紧密地绑定到特定项目。例如,想象一下如果创建RecyclerView时使用预设的深色背景和特定的视图布局而没有提供更改预设的方法会发生什么情况。

这很严格吧?这就是为什么创建RecyclerView如此灵活非常重要。

因此回到回调接口。

就像我之前说过的那样,Android开发中的大多数组件都是在考虑重用的情况下开发的。当然,需要某些预设值,但是您应该使应该灵活的部分变得灵活。

因此,诸如ViewHolders之类的组件可能会被应用程序中的其他适配器重用。适配器之类的组件可能会被您应用中的其他RecyclerView重用。为了使其可重用,您不能编写任何太具体的东西来限制它在特定类中的使用。

所以我给你两种情况:

  1. 您的ViewHolder中有一个可单击的视图,并将其编码为直接启动“ SecondActivity.class”。现在,只要单击该视图,它将启动该Activity。即使您在另一个要启动SecondActivity的适配器中重用此ViewHolder,这种行为也不会改变。

  2. 您创建一个回调接口以在ViewHolder中使用。单击视图后,将改为运行回调接口,因此,现在,如果开发人员设置了自定义代码...,也将运行自定义代码。在这种情况下,您可以将ViewHolder设置为在一个实现中启动SecondActivity.class,而另一个实现可能使它启动ThirdActivity.class,而另一个实现可能仅启动Toast并说单击了视图。

注意第二种实现方式如何更加灵活,现在您更愿意在其他地方重用该组件了吗?

是的,虽然使用回调接口并不被认为是最好的方法(在编程中,从来没有最好的方法,只是完成您需要的更有效的方法),但它仍然是编写代码的绝佳方法更灵活。

最后一件事...如果只是您自己的代码,则无需使您的代码更具灵活性。

  • 试想一下,如果在1个柔性组件足够的情况下,必须制造10个相同组件,并且略有不同,那么...

  • 想象一下,如果您将来要更新应用程序,并且需要更改用户界面。组件过于受限,使其很难编辑。

答案 1 :(得分:0)

创建松散耦合的片段

  

为什么要为此使用界面?

一行答案是创建一个松散耦合的片段。

更多说明:
首先使用getActivity().someMethod()调用Activity方法可能很诱人。但是,建议您从Fragment调用Activity方法时使用接口。让我们来看看。

您有一个ActivityA

ActivityA{

     public void someMethod()
     {
          // do something
     }

}

您有一个Fragment

 class MyFragment{

    public void clickButton()
    {
        getActivity().someMethod();
    }

 }

现在,如果您想在其他Fragment中使用此ActivityB

ActivityB{

   public void someOtherMethod()
   {
        // do some other stuff
   }

} 

现在您将如何使用该片段?

您将不得不更改片段中的一些代码。这意味着该片段未与所有活动松散耦合。

现在让我们看一下我们使用接口处理此事

public interface MybuttonListener{

    public void myButtonClicked();

} 

什么是片段代码?

class MyFragment{

  private MybuttonListener listener;

  public void clickButton()
  {
     listener.myButtonClicked();
  }

  public void onActivityCreated(Context context)
  {
     this.listener = (MybuttonListener)context;
  }
}

现在,此片段与所有活动松散耦合。

您只需要在活动中实现MybuttonListener并重写该方法。而已。

对于ActivityA

ActivityA implements MybuttonListener{

   public void someMethod()
   {
      // do something
   }

   @Override
   public void myButtonClicked(){
      someMethod();
   }

}

用于活动B

ActivityB implements MybuttonListener{

    public void someOtherMethod(){

        // do some other stuff

    }

    @Override
    public void myButtonClicked(){
        someMethod();
    }

}