通过 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 总是返回 null

findFragmentByTag() 在使用 replace() 方法执行 FragmentTransaction 后返回 null

DialogFragment findFragmentByTag 返回 null

从活动调用片段方法时出现空指针异常

从 NavController 获取片段

片段回栈和替换