- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
Eclipse 生成的主细节流程在扩展 ListFragment
的类中有一些回调魔法 - 我说魔法是因为当你是 Android 和 Java 菜鸟时,它看起来就像是同时: )
鉴于下面的代码,有人可以为我回答几个问题:
ListFragment
的onAttach
方法对mCallbacks = (Callbacks) Activity
有何作用?ListFragment
的onListItemClick
方法中调用了哪个onItemSelected
方法,需要实现的还是onItemSelected
中的FragmentActivity
?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()
时,FragmentActivity
的 onItemSelected
方法将被调用,该方法中的代码将被调用运行。如果稍后调用 onDetach
,mCallbacks
将再次指向 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/
我们打算做一主两从的配置。我们的目标如下。我们有大量的传入记录,因此我们计划执行以下操作: Master - has only past 7 days records Slave 1 - as sam
我已经成功地设置了一个主从环境,它绝对可以正常工作。 我遇到的唯一问题是从表中选择计数,它们不相同但是在 5 分钟后从主选择,在从属上创建 50 行,也创建 50 行(这就是为什么我说我'我确定它工作
我有一个与 MariaDb 实例相关的业务需求,该实例应该在具有故障转移功能的主从配置中工作。 查看我看到的文档,可以配置多集群主机 (galera) 或简单的主从副本。 配置主从+故障转移有什么建议
我想将 qml 与主从界面一起使用,但我不知道如何以正确的方式将当前项目传递到详细信息 View 。主视图中的 ListView 使用 C++ 模型(QSQLTableModel 的附加组件,它工作正
我有一个主从 fragment 布局,看起来像这样: 当从 ListView 中选择一个数字时,详细 View 中的值会发生变化(即单选按钮文本发生变化)。我有以下问题:当我在 ListView 中单
当主服务器已经有大量数据时,有没有办法复制mysql。我尝试了常规方法,但很难获取MASTER_LOG_POS值。从服务器如何能够复制主服务器上先前存在的数据。 最佳答案 通常,您会从现有数据库的完整
如果主数据库出现故障,我想切换从数据库。我找到了 Master/Slave开关,但它用于读写(看起来很合乎逻辑,但不是这种情况)。你能在 zend 中给出“db failure”策略吗? 最佳答案 看
场景: 我们的架构基于 memcached,随着用户群数量的增加,我们需要将缓存复制到多个服务器。 我们可以使用repcached实用程序轻松地在两台服务器之间进行复制。 我们希望以这样的方式负载平衡
单机配置启动 Redis安装 下载地址: http://redis.io/download 安装步骤: 1: 安装gcc编译器:yum install gcc 2:
我有一些关于主从数据复制的问题,是否有机会重新同步它们,以便在主从数据中拥有相同的数据,而无需尝试在从属数据上手动添加与主数据相同的数据? 最佳答案 一种选择是对主服务器进行备份并使用它来完全替换副本
我有一个Master和一个Slave 操作系统:MySQL5.6 & RHEL 7.0 复制状态:运行良好 一切工作正常且正确我想检查数据是否在服务器之间正确复制(主到从),并在 mysqlrplsy
我是 pgbouncer 1.7 的新手,我想用主从配置来配置它。 我已经使用 repmgr 配置了 postgres 9.3 流复制,我想使用 pgbouncer 进行负载平衡和连接池,以便在主服务
我想将一个从站连接到 Master-Jenkins,但是在尝试连接时出现以下错误: [05/02/18 15:26:59] [SSH] Opening SSH connection to Key e
我在 Windows 计算机上运行 SonarQube Server 和 Jenkins 实例。 我已经创建了 Jenkins 作业来使用 SonarQube 生成代码覆盖率报告。该作业在 Linux
我有一个这个模型(它不是实际代码,为了清楚起见,我省略了 INotifyPropertyChanged 实现)。 public class Project { public Ob
我正在使用分开的主细节剑道 ui 网格。主网格位于标签条 1 (tabstrip.select(0)) 内。添加/编辑字段(用于主网格)位于首页的标签条 2 (tabstrip.select(1))
我有 5 个选项卡栏项目。第五项是 UISplitViewController。在肖像模式下,在应用程序启动时,我可以看到详细信息屏幕,而不是主屏幕。我期待着大师的到来。在横向模式下,主从细节工作正常
作为 swift 的新手,我正在尝试使用 Master View Controller,在其中我使用 JSON 阅读博客并将其存储在核心数据中。一切都很好,只是我不明白如何在向右滑动和删除时从核心数据
我正在尝试使用主从复制配置 MySQL 数据库。在我意识到必须使用此复制来设置环境之前,我已经有 2 台独立的服务器运行它们自己的 MySQL 数据库。这些服务器中的每一个的配置都完全相同。 MySQ
我有一个正在运行的 Django 应用程序。我使用的数据库后端是 PostGreSql。一切对我来说都很好。 现在我想为我的数据库创建一个主从复制,这样: 无论 master 发生什么变化,都会在 s
我是一名优秀的程序员,十分优秀!