【问题标题】:Android Studio fragment - onButtonPressed methodAndroid Studio 片段 - onButtonPressed 方法
【发布时间】:2016-01-04 22:46:03
【问题描述】:

当使用 Android Studio 创建一个新的 Fragment 时,它会生成 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);
    }
}

【问题讨论】:

    标签: android android-fragments android-studio


    【解决方案1】:

    Fragments 附加到 Activity,onFragmentInteraction 是您的 Activity 用来与 Fragment 交互的回调方法

    例如,以下活动从您的片段中实现接口

    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"));
            }
        }
    });
    

    【讨论】:

    • 但是为什么片段需要一个带有 URI 的按钮侦听器而不是带有视图的传统 onClick 侦听器呢?
    【解决方案2】:

    作为菜鸟,我发现其他答案有点模糊。 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 似乎只是这样,并没有提供非常有用的实现。也许在 android 网站上有一个教程解释了如何捕获事件并重定向到这个方法。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多