Eclipse生成的主详细信息流在类中有一些回调魔法,扩展了ListFragment
- 我说魔术,因为当你是Android和Java noob时,它就像是一样的,一下子:)
鉴于以下代码,有人可以为我回答几个问题:
onAttach
的{{1}}方法对ListFragment
做了什么?mCallbacks = (Callbacks) activity
的{{1}}方法中调用了哪个onItemSelected
方法,需要实施的方法或onListItemClick
中的ListFragment
?onItemSelected
方法都采用FragmentActivity
类型onItemSelected
(因为id
String
是DummyContent
)。如果我将id
String
更改为DummyContent
,我需要更改哪些id
方法?我尝试更改long
中的那个但是onItemSelected
,所以我不允许:( 谢谢
FragmentActivity
还有一个档案......
@Override
答案 0 :(得分:4)
ListFragment的onAttach方法对mCallbacks =有什么作用? (回调)活动?
在onAttach
回调中,Activity
/ FragmentActivity
(Fragment
将绑定/使用的)将传递到Fragment
个实例(通过活动参数)。该行只是将Activity
转换为Callbacks
接口,以便稍后在Fragment
中使用(见下文)。您的Activity
必须实现该界面,否则代码将因先前的if
条件而失败。基本上,onAttach
方法中的代码表示:“将使用此片段的Activity必须实现Callbacks接口,否则代码将失败并出现IllegalStateException”。
在onListItemClick方法中调用哪个onItemSelected方法 ListFragment,需要实现或onItemSelected的 FragmentActivity?
在一个非常原始的解释中:RecordingListFragment
将引用( mCallbacks 字段)保存到Callbacks
类型对象(意味着实现{{1}的类) }接口)。最初,对于此Callbacks
引用,代码将分配一个默认/空Callabacks
引用( sDummyCallbacks ),它不执行任何操作(所以不,您不必为Callbacks
提供一些实现,因为它的 onItemSelected 是空的,这是为了避免在某些情况下可能sDummyCallbacks
(例如,如果你没有分配东西) NullPointerException
字段,您可以在其上调用mCallbacks
。运行onItemSelected
方法时,对onAttach
将存在的Activity
的引用将转换为Fragment
并放入Callbaks
字段。发生这种情况后,当您致电mCallbacks
时,将调用mCallbacks.onItemSelected()
的{{1}}方法,并运行该方法的代码。如果稍后调用FragmentActivity
,则onItemSelected
将再次指向onDetach
,在此情况发生后,调用mCallbacks
将无效。
上面的界面系统很重要,因为它会使您的sDummyCallbacks
成为代码中更可重用的组件,因为它不会与特定的mCallbacks.onItemSelected()
实施相关联。当用户点击片段列表中的项目时,您将调用RecordingListFragment
引用上的Activity
来运行该对象的onItemSelected
方法(在您的案例中为Activity)。你的片段不知道如何实现接口,它甚至不关心。想想,例如,您有三个活动,每个活动都使用mCallbacks
片段。您将如何更改onItemSelected
类以使其适用于将使用它的三个活动?
所有这些onItemSelected方法都采用String类型的id(因为 DummyContent id是一个String)。如果我将DummyContent id更改为long, 我需要更改哪些onItemSelected方法?我试过改变 FragmentActivity中的那个,但这有@Override所以我不被允许 致:(
修改界面:
RecordingListFragment
如果保存java文件,Eclipse会抱怨(必须覆盖超类方法)实现此接口的位置。对于RecordingListFragment
:
public interface Callbacks {
public void onItemSelected(long id);
}
同样,sDummyCallbacks
实现了private static Callbacks sDummyCallbacks = new Callbacks() {
@Override
// NEEDS IMPLEMENTATION - i guess???? <- it doesn't need no implementation
// it's purpose is to do nothing
public void onItemSelected(long id) {
}
};
接口,因此您也需要更改它:
FragmentActivity
最后,您将在片段中使用Callbacks
:
public class RecordingListActivity extends FragmentActivity
implements RecordingListFragment.Callbacks {
@Override
public void onItemSelected(long id) {
if (mTwoPane) {
// ...
我建议你花点时间研究一下java语言,这样你就可以了解Android代码而不是Android代码+ java方式。