我正在做一个典型的片段活动,左窗格 Fragment A 作为列表,右窗格 Fragment B 作为内容(在平板电脑上),在手机上两者都在一个窗格中。
一切都在平板电脑版本上运行良好。但是在手机版上我遇到了问题。我的 Fragment B 由一些 TextViews 和在它们下面的一个 GridView 组成。每次用户单击网格项时,我都想更新 TextViews。这工作正常。问题在于在网格适配器中实现 AlertDialog:
OnClickListener clickListener = new OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext.getContext());
...
builder.setPositiveButton(mContext.getContext().getResources().getString(
R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
fragActivity.getSupportFragmentManager().executePendingTransactions();
FragmentB f = (FragmentB)
((MyActivity) fragActivity).getSupportFragmentManager()
.findFragmentByTag(FragmentB.TAG);
item.setAmount(helperDouble); //shouldn't be relevant to the problem
if (f != null) {
Log.i("GridAdapter", "f is not null, updating views");
f.updateViews();
} else {
Log.i("GridAdapter", "f is null, what the...");
}
}
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
};
FragmentB f 每次在平板电脑上都返回正常,但无论我做什么,它总是在手机上返回 null。它似乎与此 SO 帖子相似,但我不知道是否可以将其应用于我的情况。这是我在 MyActivity 中添加片段的方法:
@Override
public void onCustomerSelected(Customer customer, int index) {
//update fragment here
if (isScreenSizeLarge()) { //if tablet:
FragmentB f;
//if fragment doesn't exist, create it
if (getSupportFragmentManager().findFragmentByTag(FragmentB.TAG) == null) {
f = FragmentB.newInstance(customer, index);
FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.add(R.id.fragment_b_container, f, FragmentB.TAG);
trans.commit();
getSupportFragmentManager().executePendingTransactions();
} else {
f = (FragmentB) getSupportFragmentManager()
.findFragmentByTag(FragmentB.TAG);
}
} else { //if phone:
FragmentB newCartFrag = FragmentB.newInstance(customer, index);
FragmentTransaction newTrans = getSupportFragmentManager().beginTransaction();
newTrans.replace(R.id.fragment_container, newCartFrag);
newTrans.addToBackStack(FragmentB.TAG);
newTrans.commit();
getSupportFragmentManager().executePendingTransactions();
}
}
(是的,我知道我调用了 executePendingTransactions() 两次,以防万一。)
所以我假设问题与片段的片段(或片段活动)“失去焦点”有关。我只是不明白为什么它会在平板电脑上找到它(它可能会失去焦点,因为它需要担心两个片段)而不是手机(其中 FragmentB 是当时唯一的活动片段)之间的区别。