【发布时间】:2016-09-17 14:59:01
【问题描述】:
这里是初学者。
据我了解,片段应通过其托管活动相互通信,以在其他情况下保持独立和可重用。
我读到应该通过在片段中声明接口并在活动中实现它们来完成。 这是“仅仅”处理它的最佳方式吗,因为您可以确保 Activity 已为该通信做好准备(它确实具有处理该通信的方法)?
由于我很难围绕接口(以及 java/android 中的许多其他东西,就此而言),这可以在没有接口的情况下完成吗?我可以在片段中获取对托管活动的引用并调用该活动的方法吗?
(片段类)
Activity activity = getActivity();
activity.doThatThingToOtherFrag(String myString);
(活动类)
Fragment otherFragment = getSupportFragmentManager().findFragmentById(R.id.myOtherFrag);
public void doThatThingToOtherFrag(String string) {
//do something to myOtherFrag
}
或者在这种情况下我没有得到关于实现接口的其他内容?
* 编辑 *
假设我在另一个活动中重用了该片段。只要该活动还具有 doThatThingToOtherFrag(String myString) 方法,我就可以通过 getActivity() 获取对它的引用,并且仍然调用 activity.doThatThingToOtherFrag( String myString) 来自我的片段,对吧?我不需要更改我的片段代码中的任何内容——还是我在这里遗漏了什么?
我想我的问题应该是:那里的接口是否只是为了确保/任何托管活动实现 doThatThingToOtherFrag 方法?或者在这种情况下还有什么我不知道的接口吗?感谢您的帮助!
【问题讨论】:
-
好吧,你错过了它不是
Activity而是MyActivity的事实,你的方法调用更像((MyActivity)activity).doThatThing..换句话说,因为doThatThing属于MyActivity您将不得不将哪些紧密耦合到 MyActivity。 -
...要重用,您每次都必须更改此演员表,除非您对接口进行编程。如果您总是在处理 Activity(而不是子类),那么接口没有意义,但它假定
doThatThing是您编写的方法,而不是已经属于您的Activity基类的东西。跨度> -
我认为我可以将任何 Activity 子类(例如
FragmentActivity)简单地转换为(Activity)并且只要有 doThatThing 方法,我就不必更改片段中的任何内容代码。 -
当然,但在这种情况下,您正在向上转换 - 向上转换为基类。通常,您从 Activity 扩展并在那里实现一些东西 - 要使用您添加到 MyActivity 的方法,您需要向下转换(这不是一个好习惯)。
-
一个不涉及强制转换的示例...假设您的片段有一个方法
setMyActivity( MyActivity activity )其中MyActivity基本上是您的应用程序(并扩展了Activity)。现在假设您添加了一个新活动MyActivity2,并且您也想在那里使用您的片段 - 哎呀,您需要重写您的setMyActivity方法来传递MyActivity2。很不方便。
标签: java android android-fragments