使用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
实例更合适。
让我们考虑一下每个组件的代码;即INTERFACE
、ACTIVITY
、FRAGMENT
,最后是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
属于侦听器,也就是实现INTERFACE
的ACTIVITY
,并且它相应地突出显示了相关的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。