eclipse生成的master detail流在类中有一些回调魔术,它扩展了ListFragment
-我之所以说魔术,是因为当你是android和java noob时,它看起来就是这样的:)
鉴于下面的代码,有人可以为我回答几个问题:onAttach
的ListFragment
方法与mCallbacks = (Callbacks) activity
有什么关系?
在onItemSelected
的onListItemClick
方法中,哪个ListFragment
方法被调用,哪个需要实现,哪个onItemSelected
方法在FragmentActivity
中被调用?
所有这些方法都采用onItemSelected
类型的id
(因为String
DummyContent
是id
)。如果我将String
DummyContent
更改为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方式。