gpt4 book ai didi

android - 主从流程回调 'magic'

转载 作者:搜寻专家 更新时间:2023-11-01 08:06:42 29 4
gpt4 key购买 nike

Eclipse 生成的主细节流程在扩展 ListFragment 的类中有一些回调魔法 - 我说魔法是因为当你是 Android 和 Java 菜鸟时,它看起来就像是同时: )

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

  1. ListFragmentonAttach 方法对mCallbacks = (Callbacks) Activity 有何作用?
  2. ListFragmentonListItemClick方法中调用了哪个onItemSelected方法,需要实现的还是onItemSelected中的FragmentActivity?
  3. 所有这些 onItemSelected 方法都采用 String 类型的 id(因为 DummyContent id 是一个 String)。如果我将 DummyContent id 更改为 long,我需要更改哪些 onItemSelected 方法?我尝试更改 FragmentActivity 中的那个,但是它有 @Override 所以我不允许 :(

谢谢

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);
}
}
}

最佳答案

What does the onAttach method of the ListFragment do with mCallbacks = (Callbacks) activity?

onAttach 回调中 Activity/FragmentActivity(Fragment 将绑定(bind)/使用)被传递给那个 Fragment 实例(通过 activity 参数)。该行只是将该 Activity 转换为 Callbacks 接口(interface),以便稍后在 Fragment 中使用(见下文)。您的 Activity 必须 实现该接口(interface),否则代码将因前面的 if 条件而失败。基本上,onAttach 方法中的代码表示:“将使用此 fragment 的 Activity 必须实现 Callbacks 接口(interface),否则代码将因 IllegalStateException 而失败”。。 p>

Which onItemSelected method is called in onListItemClick method of ListFragment, the one which needs implementation or onItemSelected in FragmentActivity?

在一个非常原始的解释中:RecordingListFragment 保留对 Callbacks 类型对象(意味着一个类实现了 Callbacks 接口(interface))。最初,对于此 Callbacks 引用,代码将分配一个默认/空的 Callbacks 引用 (sDummyCallbacks),它不执行任何操作(所以不,您不必为 sDummyCallbacks) 提供一些实现,因为它的 onItemSelected 是空的,这是为了避免在某些情况下可能出现的 NullPointerException (例如,如果您没有将某些内容分配给 mCallbacks 字段并且您在其上调用了 onItemSelected)。当 onAttach 方法运行时,对 Activity 的引用将被转换为 Callbaks,其中 Fragment 将存在于此并放入 mCallbacks 字段。发生这种情况后,当您调用 mCallbacks.onItemSelected() 时,FragmentActivityonItemSelected 方法将被调用,该方法中的代码将被调用运行。如果稍后调用 onDetachmCallbacks 将再次指向 sDummyCallbacks,在此之后,调用 mCallbacks .onItemSelected() 什么都不做。

上面的接口(interface)系统很重要,因为它将使您的 RecordingListFragment 成为代码中更可重用的组件,因为它不会绑定(bind)到特定的 Activity 实现。当用户单击 fragment 列表中的项目时,您将调用 mCallbacks 引用上的 onItemSelected 以从该对象运行 onItemSelected 方法(在你的情况下的 Activity )。您的 fragment 不知道如何实现接口(interface),它甚至不在乎。例如,假设您有三个 Activity ,每个 Activity 都使用一个 RecordingListFragment fragment 。您需要如何更改 RecordingListFragment 类以使其适用于将使用它的三个 Activity ?

All these onItemSelected methods take an id of type String (because DummyContent id is a String). If I changed DummyContent id to a long, which onItemSelected methods would I need to change? I tried changing the one in FragmentActivity but this has @Override so I wasn't allowed to :(

修改界面:

public interface Callbacks {

public void onItemSelected(long id);
}

如果您保存 java 文件,Eclipse 将提示(您必须覆盖父类(super class)方法)实现此接口(interface)的位置。对于 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 接口(interface),因此您也需要更改它:

public class RecordingListActivity extends FragmentActivity
implements RecordingListFragment.Callbacks {

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

最后,您将在 fragment 中使用 mCallbacks:

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

我建议您花一些时间学习一下 java 语言,这样您就会努力理解 Android 代码,而不是 Android 代码 + java 方式。

关于android - 主从流程回调 'magic',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13557930/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com