【发布时间】:2013-06-11 07:29:30
【问题描述】:
在 Eclipse 中采用默认的“Master/Detail”流模板,并添加第三个 Fragment(我们称之为 Edit,从预先存在的 Detail Fragment 启动),我现在希望在用户打开 Edit Fragment点击 Detail Fragment 中的项目。
我已经在 Detail 片段上实现了一个接口,但是根据应用程序是在平板电脑还是手机上(双窗格与否),Iterface 需要由 Detail Activity 或 Main Activity 实现为了发挥作用。我认为这是由于模板在设备未处于双窗格模式时将打开详细信息片段作为活动实现的方式。
我是否错误地实现了这一点,或者是否有最佳实践可以让我将接口的实现统一到主要活动中?
这里有一些来自 Master 和 Detail Fragments 的简化的 sn-ps,显示了 Detail Fragments 接口的双重实现的要求。
WaveListWactivity.java 的代码(第一个片段)
public class WaveListActivity extends FragmentActivity implements
WaveListFragment.Callbacks,WaveDetailFragment.Callbacks {
private boolean mTwoPane;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wave_list);
if (findViewById(R.id.wave_detail_container) != null) {
mTwoPane = true;
((WaveListFragment) getSupportFragmentManager().findFragmentById(
R.id.wave_list)).setActivateOnItemClick(true);
}
}
//Interface from WaveListFragment
@Override
public void onWaveSelected(int id) {
if (mTwoPane) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.wave_detail_container, new WaveDetailFragment()).commit();
} else {
Intent detailIntent = new Intent(this, WaveDetailActivity.class);
startActivity(detailIntent);
}
}
//Interface from WaveDetailFragment
@Override
public void onItemSelected(int id) {
if (mTwoPane) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.wave_detail_container, new WaveEditFragment()).addToBackStack(null).commit();
} else {
Intent detailIntent = new Intent(this, WaveDetailActivity.class);
startActivity(detailIntent);
}
}
}
WaveDetailActivity.java 的代码(第二个片段)
public class WaveDetailActivity extends FragmentActivity implements WaveDetailFragment.Callbacks {
private boolean mTwoPane;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wave_detail);
if (findViewById(R.id.wave_detail_container) != null) {
mTwoPane = true;
}
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction().add(R.id.wave_detail_container, new WaveDetailFragment()).commit();
}
}
//Callback from WaveDetailFragment
@Override
public void onItemSelected(int id) {
if (mTwoPane) {
getSupportFragmentManager().beginTransaction().replace(R.id.wave_detail_container, new WaveEditFragment()).addToBackStack(null).commit();
} else {
Intent detailIntent = new Intent(this, WaveEditActivity.class);
startActivity(detailIntent);
}
}
}
【问题讨论】:
标签: android android-activity fragment communication