不附着于活性的片段怎么弄?

  • 回答 (10)
  • 关注 (0)
  • 查看 (28)

我创建了一个小测试应用程序,它代表了我的问题。我使用ActionBarSherlock来用(Sherlock)片段实现选项卡。

我的代码:TestActivity.java

public class TestActivity extends SherlockFragmentActivity {
    private ActionBar actionBar;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setupTabs(savedInstanceState);
    }

    private void setupTabs(Bundle savedInstanceState) {
        actionBar = getSupportActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        addTab1();
        addTab2();
    }

    private void addTab1() {
        Tab tab1 = actionBar.newTab();
        tab1.setTag("1");
        String tabText = "1";
        tab1.setText(tabText);
        tab1.setTabListener(new TabListener<MyFragment>(TestActivity.this, "1", MyFragment.class));

        actionBar.addTab(tab1);
    }

    private void addTab2() {
        Tab tab1 = actionBar.newTab();
        tab1.setTag("2");
        String tabText = "2";
        tab1.setText(tabText);
        tab1.setTabListener(new TabListener<MyFragment>(TestActivity.this, "2", MyFragment.class));

        actionBar.addTab(tab1);
    }
}

TabListener.java

public class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener {
    private final SherlockFragmentActivity mActivity;
    private final String mTag;
    private final Class<T> mClass;

    public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
    }

    /* The following are each of the ActionBar.TabListener callbacks */

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag);

        // Check if the fragment is already initialized
        if (preInitializedFragment == null) {
            // If not, instantiate and add it to the activity
            SherlockFragment mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName());
            ft.add(android.R.id.content, mFragment, mTag);
        } else {
            ft.attach(preInitializedFragment);
        }
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag);

        if (preInitializedFragment != null) {
            // Detach the fragment, because another one is being attached
            ft.detach(preInitializedFragment);
        }
    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // User selected the already selected tab. Usually do nothing.
    }
}

MyFragment.java

public class MyFragment extends SherlockFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        new AsyncTask<Void, Void, Void>() {

            @Override
            protected Void doInBackground(Void... params) {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException ex) {
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void result){
                getResources().getString(R.string.app_name);
            }

        }.execute();
    }
}

我增加了Thread.sleep部分模拟下载数据中的代码onPostExecute是模拟使用Fragment...

当我在景物和肖像之间快速旋转屏幕时,我在onPostExecute代码:

java.lang.IllegalStateException: Fragment MyFragment{410f6060} not attached to Activity

我认为这是因为同时创建了一个新的MyFragment,并且在AsyncTask完成之前附加到ActivityonPostExecute中的代码调用一个未连接的MyFragment

但是我怎样才能解决这个问题?

MOISTGMOISTG提问于
文艺青年对穿肠回答于

当带有加载首选项的应用程序设置活动可见时,我遇到了类似的问题。如果我要更改其中一个首选项,然后使显示内容旋转并再次更改首选项,它将崩溃,其中会出现一个消息,即片段(MyPreferences类)没有附加到活动中。

调试时,当显示内容旋转时,它看起来就像PreferencesFrament的onCreate()方法被调用了两次。已经够奇怪的了。然后,我在块之外添加了isAdded()检查,它将指示崩溃,并解决了这个问题。

以下是更新首选项摘要以显示新条目的侦听器代码。它位于MyPreferences类的onCreate()方法中,它扩展了PreferenceFrage类:

public static class Preferences extends PreferenceFragment {
    SharedPreferences.OnSharedPreferenceChangeListener listener;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // ...
        listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
                // check if the fragment has been added to the activity yet (necessary to avoid crashes)
                if (isAdded()) {
                    // for the preferences of type "list" set the summary to be the entry of the selected item
                    if (key.equals(getString(R.string.pref_fileviewer_textsize))) {
                        ListPreference listPref = (ListPreference) findPreference(key);
                        listPref.setSummary("Display file content with a text size of " + listPref.getEntry());
                    } else if (key.equals(getString(R.string.pref_fileviewer_segmentsize))) {
                        ListPreference listPref = (ListPreference) findPreference(key);
                        listPref.setSummary("Show " + listPref.getEntry() + " bytes of a file at once");
                    }
                }
            }
        };
        // ...
    }

回答过的其他问题

腾讯云的实时语音趣味变声是如何实现的呢?有哪些应用场景呢?

变声的原理,即是通过改变人声的音调、音色,使输出声音在感官上与原始声音不同。人耳分辨人声,是通过音色和音调两个维度去做区分。日常所说的男中音、男高音,就是音调不同;音调一致的情况下,我们依然能通过音色去区分人声。变声器,正是借助对声音音色和音调的双重复合改变,实现输出声音的改变。...... 展开详请

云安全与“传统”网络安全有何不同?

有些人认为云计算本质上不如传统方法安全。偏执主要是因为该方法本身感觉不安全,您的数据存储在您不拥有或控制的服务器和系统上。 但是,控制并不意味着安全。正如我们在本报告中发现的那样,以及过去几年的事件发生情况,数据的物理位置比访问方式更重要。基于云的系统和传统的企业计算都是如此。此...... 展开详请

如何通俗的了解kubernetes容器编排?

高考在即,刷脸进考场真得靠谱吗?

1:1人脸识别技术主要是利用图像处理技术从图像中提取人像特征点,利用生物统计学的原理进行分析建立数学模型,即人脸特征点模型。再从人脸特征点模型与被测者的人的面像进行特征分析,根据分析的结果来给出一个相似值,通过这个值即可确定是否为同一人。简单的说就是A/B两张照片比对,产生的计算...... 展开详请

直播答题为什么会这么火?

云通信有无关键词过滤功能?

云通信的脏字集中已经涵盖了一批默认脏字(政治、色情等领域),如果用户发送消息命中脏字,会返回失败,错误码80001,脏字说明详细可参考:https://www.qcloud.com/document/product/269/2396#1-.E8.83.8C.E6.99.AF.E8...... 展开详请

所属标签

扫码关注云+社区