通过 findFragmentByTag 从 FragmentManager 获取 DialogFragment
Posted
技术标签:
【中文标题】通过 findFragmentByTag 从 FragmentManager 获取 DialogFragment【英文标题】:Get DialogFragment from FragmentManager by findFragmentByTag 【发布时间】:2014-08-15 08:45:46 【问题描述】:我已经通过 DialogFragment 创建了一个进度对话框,为此我使用这篇文章作为我的 DialogFragment 的基础:https://gist.github.com/daichan4649/6421407 实际上在我的应用程序中我有一个调用类的活动,并且这个类使用 AsyncTask 复制保存sqlite 数据库中的一些数据。 我使用进度对话框来显示 AsyncTask 进度。
我的代码有效,但是有一个小问题:当用户旋转设备时,进度条不再更新,因为 findFragmentByTag 返回始终为 null。
这是我的一小段代码。我认为问题出在这里:
public class TafData
private Context mContext;
public TafDownload(Context context)
mContext = context;
... other code ...
private class importTAFAsync extends AsyncTask <String, Integer, String>
... other code ...
private void showProgress()
TafActivity tafactivity = (TafActivity) mContext;
FragmentManager fm = tafactivity.getFragmentManager();
ProgressDialogFragment pDialog = ProgressDialogFragment.newInstance("Caricamento TAF", "Caricamento in corso. Attendere...", 100);
pDialog.show(fm, "fragment_progress");
private void setMax(Integer... values)
ProgressDialogFragment progress = getProgressDialogFragment();
if (progress == null)
return;
progress.setMax(values[0]);
private void updateProgress(Integer... values)
ProgressDialogFragment progress = getProgressDialogFragment();
if (progress == null)
return;
progress.updateProgress(values[0]);
private void hideProgress()
ProgressDialogFragment progress = getProgressDialogFragment();
if (progress == null)
return;
progress.dismissAllowingStateLoss();
private ProgressDialogFragment getProgressDialogFragment()
TafActivity tafactivity = (TafActivity) mContext;
Fragment fragment = tafactivity.getFragmentManager().findFragmentByTag("fragment_progress");
return (ProgressDialogFragment) fragment;
这是一个清单:
<activity
android:name="com.myapp.TafActivity"
android:label="@string/title_activity_taf">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="myapp.MapsActivity" />
</activity>
【问题讨论】:
你能发布你的 AndroidManifest.xml 吗?或者至少是清单中 TafActivity 的 Activity 声明。 @JDJ 您需要所有清单或正在寻找特别的东西。如果可能,我想避免发布所有清单,但如果您认为这可以帮助我可以做到。 我只需要从清单中查看您对 TafActivity 的 声明。 @JDJ 我在问题上添加了清单的一部分。 谢谢。尝试在活动声明中添加android:configChanges="orientation|keyboardHidden"
【参考方案1】:
将此行添加到您在 AndroidManifest.xml 中的 TafActivity 声明中:
android:configChanges="orientation|keyboardHidden"
这将防止系统在方向更改时破坏您的活动。
【讨论】:
是的,我知道,但我希望允许用户旋转设备。我不想阻止它。 这仍然允许用户旋转设备。 我已尝试将您的字符串添加到清单中。屏幕可以旋转,但我有同样的问题。旋转后进度不会更新,因为 findFragmentByTag 返回 null。 在调用 findFragmentByTag 之前,请尝试执行以下操作:FragmentManager fm = tafactivity.getFragmentManager();
fm.executePendingTransactions();
您有机会尝试吗?以上是关于通过 findFragmentByTag 从 FragmentManager 获取 DialogFragment的主要内容,如果未能解决你的问题,请参考以下文章
findFragmentByTag() 在使用 replace() 方法执行 FragmentTransaction 后返回 null