【发布时间】:2014-03-05 20:17:03
【问题描述】:
所以我有一个嵌套的片段,例如:
public class AbstractFragment extends Fragment {
public int resultCode;
protected void startFragment(AbstractFragment fragment, int resultCode){
this.resultCode = resultCode;
Log.w(this, "startFragment(). fragment: "+fragment+" resultCode: "+this.resultCode);
((MainActivity)getActivity()).addFragmentToBackStack(fragment);
}
}
而MainActivity有对应的方法:
public class MainActivity extends FragmentActivity {
public void addFragmentToBackStack(Fragment fragment){
Log.w(this, "addFragmentToBackStack(). fragment: "+fragment+" resultCode: "+((AbstractFragment) fragment).resultCode);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.content_frame, fragment, fragment.getClass().getName())
.addToBackStack(null)
.commit();
}
}
片段正在像这样开始
public class DynamicsFragment extends AbstractFragment{
public static final int DYNAMICS_CODE = 2;
...
startFragment(new DynamicsAddFragment(), DYNAMICS_CODE);
...
}
我得到的结果完全让我感到困惑,因为根据日志,OOP 的基本原理在这里不起作用:
03-05 21:35:05.700: W/DynamicsFragment(8533): startFragment(). fragment: DynamicsAddFragment{413453d8} requestCode: 2
03-05 21:35:05.700: W/MainActivity(8533): addFragmentToBackStack(). fragment: DynamicsAddFragment{413453d8} requestCode: 0
我检查了整个项目,希望能找到一些可以将resultCode 设置为 0 的代码,但没有。唯一设置resultCode 的地方是AbstractFragment 的startFragment 方法,当然DynamicsAddFragment 扩展AbstractFragment。如果创建了 DynamicsAddFragment 的新实例但项目中没有此类代码,则 resultCode 也将设置为零。
两个日志输出行都按照预期执行,一个接一个。但是 ATM startFragment 运行 resultCode 字段用 2 初始化,同时 MainActivity 方法运行时该字段已经为空。例如,其他字段(例如 String 类型)也会发生同样的情况。但是实例化的片段 FOA 是一个 OBJECT!如您所见,对象的运行时 ID(唯一运行时哈希内存 ID {413453d8})是相同的!所以它绝对是同一个对象!它不是同一对象的新/另一个实例!怎么可能?!
【问题讨论】:
标签: java android oop android-fragments