Android Studio片段-onButtonPressed方法



使用Android Studio创建新片段时,它会生成onButtonPressed(Uri(方法,您应该如何将其挂接到UI事件中,比如单击xml中声明的按钮?如何使用这种方法?

// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

片段附加到活动,onFragmentInteraction是一种回调方法,您的活动使用它与片段交互

例如,以下活动实现了来自片段的接口

public static class YourActivity extends Activity
        implements YourFragment.onFragmentInteraction{
    ...
    public void onFragmentInteraction(Uri uri) {
        // Do something with uri
    }
}

但正如TODO建议的

//TODO:重命名方法,更新参数和钩子方法到UI事件

请随意根据您的需要进行调整或在不需要的情况下删除它。示例:

mYourButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
        if (mListener != null) {
            mListener.onFragmentInteraction(Uri.parse("http://www.google.com"));
        }
    }
});

我发现其他答案有点模糊,就像我自己一样。Meda指出,这个片段是附在活动上的,文档说它更多的是对它的扩展。我个人觉得FRAGMENT实例封装了一个ACTIVITY实例更合适。

让我们考虑一下每个组件的代码;即INTERFACEACTIVITYFRAGMENT,最后是LAYOUT

注意: 我正在使用Kotlin,所以当它被转换到Java中时,其中一些可能会在后台重新布线,尽管这似乎不太可能

接口

命名指定其签名的CALLBACK

 interface ConcessionSelection {
         fun selectConcession(view : View)
 }

注意:我已经将接口移动到它自己的类中,因此活动被声明为class ACTIVITY : AppCompatActivity(), INTERFACE而不是class ACTIVITY : AppCompatActivity(), FRAGMENT.INTERFACE

活动

CALLBACK提供逻辑。

 class ACTIVITY : AppCompatActivity(), INTERFACE {
     ...
     override fun CALLBACK  (view: View) {
         Log.i("ACTIVITY:CALLBACK","Activity Callback")
     }
     ...
 }

碎片

提供侦听器,并在应用程序执行期间附加或分离此类实例。

class FRAGMENT : Fragment() {  
    private var listener: ACTIVITY? = null
    ...
    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is ACTIVITY) {
            listener = context
        } else {
            throw RuntimeException(context.toString() + " must implement OnFragmentInteractionListener")
        }
    }
    override fun onDetach() {
        super.onDetach()
        listener = null
    }
    ...
}

布局

指定CALLBACK

<...>
...
<Button
        android:id="@+id/button"
        android:text="Button"
        android:onClick="CALLBACK"/> # Usually highlighted in red by IDE since this is resolved at runtime.
...
</...>

注意:这是片段的布局文件,而不是活动,我不显示活动文件,因为它不相关

如果您仔细查看了代码,您会注意到FRAGMENT上没有设置CALLBACK,而是设置在ACTIVITY上。在操作过程中,FRAGMENT将来自onClickListener的调用委派给它的listener,后者恰好是ACTIVITY。这在一定程度上混淆了Android IDE,因为它不够聪明,无法意识到CALLBACK属于侦听器,也就是实现INTERFACEACTIVITY,并且它相应地突出显示了相关的XML。事实上,在片段上设置CALLBACK被忽略,除非采取额外的步骤来捕获相关信号,例如,我相信ListFragment这样做是为了重定向到onItemSelected

模板提供的示例onButtonPressed似乎只是这样,并没有提供非常有用的实现。也许安卓网站上有一个教程,解释了如何捕获事件并重定向到该方法。

例如,您有一个名为Button:的Button

button.setOnClickLisenter(new View.OnClickListener(){
    public void onClick(View view){
        // process and construct uri
        Uri uri = null;
        onButtonPressed(uri);
    }
};

您也可以尝试其他样式来使用onButtonPressed。

相关内容

最新更新