eclipse生成的master detail流在类中有一些回调魔术,它扩展了ListFragment-我之所以说魔术,是因为当你是android和java noob时,它看起来就是这样的:)
鉴于下面的代码,有人可以为我回答几个问题:
onAttachListFragment方法与mCallbacks = (Callbacks) activity有什么关系?
onItemSelectedonListItemClick方法中,哪个ListFragment方法被调用,哪个需要实现,哪个onItemSelected方法在FragmentActivity中被调用?
所有这些方法都采用onItemSelected类型的id(因为StringDummyContentid)。如果我将StringDummyContent更改为id,需要更改哪些long方法?我试着在onItemSelected中更改一个,但这已经FragmentActivity了,所以我不能:(
谢谢你

public class RecordingListFragment extends ListFragment {

    private static final String STATE_ACTIVATED_POSITION = "activated_position";

    private Callbacks mCallbacks = sDummyCallbacks;
    private int mActivatedPosition = ListView.INVALID_POSITION;

    public interface Callbacks {

        public void onItemSelected(String id);
    }

    private static Callbacks sDummyCallbacks = new Callbacks() {
        @Override
        // NEEDS IMPLEMENTATION - i guess????
        public void onItemSelected(String id) {
        }
    };

...

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        if (!(activity instanceof Callbacks)) {
            throw new IllegalStateException("Activity must implement fragment's callbacks.");
        }

        mCallbacks = (Callbacks) activity;
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mCallbacks = sDummyCallbacks;
    }

    @Override
    public void onListItemClick(ListView listView, View view, int position, long id) {
        super.onListItemClick(listView, view, position, id);
        mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
    }

...

}

还有一个文件…
public class RecordingListActivity extends FragmentActivity
        implements RecordingListFragment.Callbacks {

    private boolean mTwoPane;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recording_list);
        getActionBar().setDisplayHomeAsUpEnabled(true);

        if (findViewById(R.id.recording_detail_container) != null) {
            mTwoPane = true;
            ((RecordingListFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.recording_list))
                    .setActivateOnItemClick(true);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onItemSelected(String id) {
        if (mTwoPane) {
            Bundle arguments = new Bundle();
            arguments.putString(RecordingDetailFragment.ARG_ITEM_ID, id);
            RecordingDetailFragment fragment = new RecordingDetailFragment();
            fragment.setArguments(arguments);
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.recording_detail_container, fragment)
                    .commit();

        } else {
            Intent detailIntent = new Intent(this, RecordingDetailActivity.class);
            detailIntent.putExtra(RecordingDetailFragment.ARG_ITEM_ID, id);
            startActivity(detailIntent);
        }
    }
}

最佳答案

listFragment的onattach方法与mcallbacks有什么关系?=
(回调)活动?
onAttach回调中,将Activity/FragmentActivity(将Fragment绑定/使用到该实例)传递给该Fragment实例(通过activity参数)。这一行只是将Activity转换到Callbacks接口,以便以后在Fragment中使用(见下文)。您的Activity必须实现该接口,否则代码将由于前一个if条件而失败。基本上,onAttach方法中的代码说:“使用此片段的活动必须实现回调接口,否则代码将失败,出现IllegalStateException。”
在的onListTempClick方法中调用的OnElected方法
ListFragment,需要实现或在中选择
碎片活动?
一个非常原始的解释是:RecordingListFragment保留对Callbacks类型对象(意味着实现Callbacks接口的类)的引用(mcallbacks字段)。最初,对于这个Callabacks引用,代码将分配一个默认的/空的Callbacks引用(sdummycallbacks),它不做任何事情(所以不,您不必为sDummyCallbacks提供一些实现),因为它的onemselected为空,这是为了在某些情况下避免可能的NullPointerException(例如,如果您不为mCallbacks字段分配某些内容,并且调用onItemSelected在上面)。当运行onAttach方法时,引用Activity >此cc>将存在,将被提交到Fragment并放入Callbaks字段。在此之后,当您调用mCallbacks时,将调用mCallbacks.onItemSelected()FragmentActivity方法,并运行该方法中的代码。如果稍后调用onItemSelected,则onDetach将再次指向mCallbacks,发生此情况后,调用sDummyCallbacks将不起任何作用。
上面的接口系统很重要,因为它将使代码中的mCallbacks.onItemSelected()组件更加可重用,因为它不会绑定到特定的RecordingListFragment实现。当用户单击片段列表中的某个项时,您将调用Activity引用上的onItemSelected来从该对象(本例中的活动)运行mCallbacks方法。您的片段不知道如何实现接口,甚至不关心。例如,假设您有三个活动,每个活动都使用一个onItemSelected片段。您需要如何更改RecordingListFragment类才能使其与将要使用它的三个活动协同工作?
所有这些OnElected方法都采用字符串类型的ID(因为
dummcontent id是一个字符串)。如果我把dummycontent id改成long,
我需要更改哪些未选定的方法?我试着改变
在fragmentactivity中,但它有@override,所以不允许我
致:(
修改接口:

public interface Callbacks {

        public void onItemSelected(long id);
}

如果保存java文件,eclipse将抱怨(必须重写超类方法)这个接口是在哪里实现的。对于RecordingListFragment
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) {
    }
};

同时sDummyCallbacks实现了FragmentActivity接口,因此您也需要更改它:
public class RecordingListActivity extends FragmentActivity
        implements RecordingListFragment.Callbacks {

    @Override
    public void onItemSelected(long id) {
        if (mTwoPane) {
    // ...

最后,在片段中使用Callbacks
@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
    mCallbacks.onItemSelected(id);
}

我建议您花点时间学习一下java语言,这样您就可以理解android代码,而不是android代码+java方式。

10-06 14:03
查看更多