草庐IT

android - fragment 分离/重新连接与显示/隐藏

coder 2023-11-26 原文

我无法找到在没有寻呼机的情况下浏览 fragment 的正确方法,而且在屏幕方向的配置更改期间我遇到了问题。我在 fragment 上使用 Show/Hide 使它们可见和起作用,但我想知道我是否应该改用 Detach/Attach。我在向后堆栈添加东西时也遇到了问题,我认为这也是由于使用了显示/隐藏。使用附加/分离更好还是有一种方法可以覆盖后退按钮的作用以使其显示/隐藏最后/当前 fragment 。

行为: 我有一个 map fragment 和一个列表 fragment 以及其他一些 fragment 。一切都正确启动,并且最初可以随着方向的改变而工作。当我导航到 ListView 时,它会正确填充,但在方向更改时,列表会在没有数据的情况下重新绘制。 map View 也被重新绘制并且在我的寻呼机标题指示器后面可见。 如果有人能给我指出正确的方向来解决这个问题,那就太棒了。我怀疑这是由我显示和隐藏 fragment 的方式引起的。

这是我创建 fragment 并将它们添加到 fragment 管理器的地方。我还展示了我在哪里显示/隐藏 fragment 。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map_frags);
    mapViewContainer = LayoutInflater.from(this)
            .inflate(R.layout.map, null);

    setupFragments();
    showFragment(0);
}
public void setListData(String name) {
    bName = name;
    showFragment(1);
}
private void setupFragments() {
    final FragmentManager fm = getSupportFragmentManager();
    final FragmentTransaction ft = fm.beginTransaction();
    mFragment1 = fm.findFragmentByTag("f1");
    if (mFragment1 == null) {
        mFragment1 = new MenuFragment();
        ft.add(mFragment1, "f1");
        ft.hide(mFragment1);
    }
    mMapFragment = (MapFragment) getSupportFragmentManager()
            .findFragmentByTag(MapFragment.TAG);
    if (mMapFragment == null) {
        mMapFragment = MapFragment.newInstance(0);
        ft.add(R.id.fragment_container, mMapFragment, MapFragment.TAG);
    }
    ft.hide(mMapFragment);

    myListFragment = (ListFrag) getSupportFragmentManager()
            .findFragmentByTag(ListFrag.TAG);
    if (myListFragment == null) {
        myListFragment = new ListFrag();
        ft.add(R.id.fragment_container, myListFragment, ListFrag.TAG);
    }
    ft.hide(myListFragment);

    frag = (frag) getSupportFragmentManager().findFragmentByTag(
            frag.TAG);
    if (frag == null) {
        bacFrag = new frag();
        ft.add(R.id.fragment_container, frag, frag.TAG);
    }
    ft.hide(bacFrag);
    ft.commit();
}

public void showFragment(int fragIn) {
    final FragmentTransaction ft = getSupportFragmentManager()
            .beginTransaction();
    ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
    if (mVisible != null) {
        if (mVisible == mListFragment) {
            ft.remove(mListFragment);
        } else {
            ft.hide(mVisible);
        } 
    }

    switch (fragIn) {
    case 0:
        ft.show(mMapFragment);
        ft.commit();
        mVisible = mMapFragment;
        break;
    case 1:
        mListFragment = (ListFragmentDisplay) getSupportFragmentManager()
                .findFragmentByTag(ListFragmentDisplay.TAG);
        Toast.makeText(this, "startListFrag", Toast.LENGTH_LONG).show();
        if (mListFragment == null) {
            mListFragment = new ListFragmentDisplay();
            ft.add(R.id.fragment_container, mListFragment,
                    ListFragmentDisplay.TAG);
        }
        ft.show(mListFragment).commit();
        mVisible = mListFragment;
        break;
    case 2:
        ft.show(myfragment).commit();
        mVisible = myfragment;
        break;
    case 3:
        ft.show(frag).commit();
        mVisible = frag;
        break;
    }
}

最佳答案

这不是你的错。问题是,当方向改变时,所有 Activity 都被销毁,甚至添加的所有 fragment 也是如此。因此其中的任何数据都不会保留。 不建议使用 android:configChanges="orientation|keyboardHidden"。 相反,为每个 fragment 设置 setRetainInstance(true),它会很好地与您当前的代码一起工作。

关于android - fragment 分离/重新连接与显示/隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13773476/

有关android - fragment 分离/重新连接与显示/隐藏的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  4. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  5. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

    我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

  6. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  7. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  8. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  9. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  10. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

随机推荐