在主细节流程中回调'魔术'

时间:2012-11-26 02:35:33

标签: android android-listview android-listfragment

Eclipse生成的主详细信息流在类中有一些回调魔法,扩展了ListFragment - 我说魔术,因为当你是Android和Java noob时,它就像是一样的,一下子:)

鉴于以下代码,有人可以为我回答几个问题:

  1. onAttach的{​​{1}}方法对ListFragment做了什么?
  2. mCallbacks = (Callbacks) activity的{​​{1}}方法中调用了哪个onItemSelected方法,需要实施的方法或onListItemClick中的ListFragment
  3. 所有这些onItemSelected方法都采用FragmentActivity类型onItemSelected(因为id StringDummyContent)。如果我将id String更改为DummyContent,我需要更改哪些id方法?我尝试更改long中的那个但是onItemSelected,所以我不允许:(
  4. 谢谢

    FragmentActivity

    还有一个档案......

    @Override

1 个答案:

答案 0 :(得分:4)

  

ListFragment的onAttach方法对mCallbacks =有什么作用?   (回调)活动?

onAttach回调中,Activity / FragmentActivityFragment将绑定/使用的)将传递到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方式。