android 片段在方向改变时创建了两次

2024-02-29

我遇到了这个奇怪的问题,我的列表片段被创建了两次,一次是在父活动上调用 super.oncreate 时,一次是在同一父活动上调用 setContentView 时。这是一个简单的应用程序,我使用不同的纵向和横向布局。

这是主要活动:

private HeadlinesFragment headlines;

@Override
public void onCreate(Bundle savedInstanceState) {
    Log.w("MainActivity", "Before super.onCreate: " + this.toString());
    super.onCreate(savedInstanceState);
    Log.w("MainActivity", "Before setContentView: " + this.toString());
    setContentView(R.layout.news_articles);

    //check to see if its portrait
    if (findViewById(R.id.fragment_container) != null) {
        if(getSupportFragmentManager().findFragmentById(R.id.fragment_container) == null) {
            headlines = new HeadlinesFragment();
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, headlines).commit();
        }
    }
}

这是layout-land文件夹中的news_articles:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">

<fragment android:name="com.example.android.fragments.HeadlinesFragment"
          android:id="@+id/headlines_fragment"
          android:layout_weight="1"
          android:layout_width="0dp"
          android:layout_height="match_parent" />

<fragment android:name="com.example.android.fragments.ArticleFragment"
          android:id="@+id/article_fragment"
          android:layout_weight="2"
          android:layout_width="0dp"
          android:layout_height="match_parent" />

这是布局文件夹中的 news_articles(用于纵向)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />

这是创建了两次的头条新闻片段

public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;

// The container Activity must implement this interface so the frag can deliver messages
public interface OnHeadlineSelectedListener {
    /** Called by HeadlinesFragment when a list item is selected */
    public void onArticleSelected(int position);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.w("HeadlinesFragment", "inside onCreate: " + this.toString());

    // We need to use a different list item layout for devices older than Honeycomb
    int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
            android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1;

    // Create an array adapter for the list view, using the Ipsum headlines array
    setListAdapter(new ArrayAdapter<String>(getActivity(), layout, Ipsum.Headlines));
}

@Override
public void onStart() {
    super.onStart();

    // When in landscape layout, set the listview to highlight the selected list item
    // (We do this during onStart because at the point the listview is available.)
    if (getFragmentManager().findFragmentById(R.id.article_fragment) != null) {
        getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    }
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception.
    try {
        mCallback = (OnHeadlineSelectedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnHeadlineSelectedListener");
    }
}


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // TODO Auto-generated method stub
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public void onDestroy() {
    Log.w("HeadlinesFragment", "inside onDestroy: " + this.toString());
    super.onDestroy();
}
}

这是文章片段

public class ArticleFragment extends Fragment {
final static String ARG_POSITION = "position";
int mCurrentPosition = 0;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) {
    Log.w("ArticleFragment", "inside onCreateView: " + this.toString());

    if (savedInstanceState != null) {
        mCurrentPosition = savedInstanceState.getInt(ARG_POSITION);
    }

    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.article_view, container, false);
    return view;
}

@Override
public void onStart() {
    super.onStart();
    Bundle args = getArguments();
    if (args != null) {
        // Set article based on argument passed in
        updateArticleView(args.getInt(ARG_POSITION));
    } else if (mCurrentPosition != -1) {
        // Set article based on saved instance state defined during onCreateView
        updateArticleView(mCurrentPosition);
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    // Save the current article selection in case we need to recreate the fragment
    outState.putInt(ARG_POSITION, mCurrentPosition);
}

@Override
public void onDestroy() {
    Log.w("ArticleFragment", "inside onDestroy: " + this.toString());
    super.onDestroy();
}

}

问题的具体情况是这样的:

1)纵向启动应用程序 2)调用setContentView并加载news_articles,但它是带有fragment_container的。 3) headersfragment 已创建 // 到目前为止正常行为 4)改变方向为横向 5) mainActivity被销毁->headlinefragment被销毁 6) mainactivity 上的 super.oncreate 被调用 7) 创建标题片段 8)调用mainactivity上的setcontentview 9) 创建另一个标题片段 //问题

我已经放置了日志,如上面的代码中所示,这是当我以纵向模式启动应用程序并更改为横向模式时的输出。

W/MainActivity(6925): Before super.onCreate: MainActivity@41d81238
W/MainActivity(6925): Before setContentView: MainActivity@41d81238
W/HeadlinesFragment(6925): inside onCreate: HeadlinesFragment{41d8d4d8 #0 id=0x7f050001}
W/MainActivity(6925): inside onDestroy: MainActivity@41d81238
W/HeadlinesFragment(6925): inside onDestroy: HeadlinesFragment{41d8d4d8 # 0id=0x7f050001}
W/MainActivity(6925): Before super.onCreate: MainActivity@41ea6258
W/HeadlinesFragment(6925): inside onCreate: HeadlinesFragment{41ea7290 #0 id=0x7f050001}
W/MainActivity(6925): Before setContentView: MainActivity@41ea6258
W/HeadlinesFragment(6925): inside onCreate: HeadlinesFragment{41eb1f30 #1 id=0x7f050002}
W/ArticleFragment(6925): inside onCreateView: ArticleFragment{41eb5f20 #2 id=0x7f050003}

我希望我已经清楚地了解了我的代码和日志,在我看来 super.oncreate 和 setcontentview 都创建了一个标题片段;至少我认为。

我的问题是为什么创建 2 个 headersfragment 实例以及如何避免这种情况。

非常感谢您对此的任何帮助


In the onCreate您的活动,您可以检查您的状态savedInstanceState捆。如果它不为空,则意味着发生了配置更改(在您的情况下,屏幕方向更改)并且您不需要重新创建您的Fragment.

你犯的另一个错误是你试图找回你的FragmentfindFragmentById。您不是传递 Fragment id,而是给它附加到 Fragment 的视图 id,这是不同的(这就是为什么我猜测这总是返回 null 的原因)。

正确的实现会更像这样(这是你的Activity) :

    //check to see if its portrait
    if (findViewById(R.id.fragment_container) != null) {
        if(savedInstanceState == null) {
            headlines = new HeadlinesFragment();
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, headlines, FRAGMENT_TAG_STRING).commit(); // Use tags, it's simpler to deal with
        } else {
            headlines = getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG_STRING);
        } 
   }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 片段在方向改变时创建了两次 的相关文章

随机推荐

  • 使用多个实例和背景大小时,Firefox 背景图像闪烁

    因此 我在页面上有几个共享背景图像的元素 我的页面正在使用 bootstrap 并且两个元素都是 3 列宽度的容器 每个都有一个背景并通过背景大小包含 在第二个元素上 我将背景宽度设置为 90 因此它比其他背景稍小 在 Firefox 中
  • 如何在 Objective-c 中的应用程序的资源文件夹中保存文件

    我正在为 iPhone 开发一个 Objective C 应用程序 我的问题是我的应用程序必须保存从网址获取的图像 我认为该文件夹是只读的 这是我保存图像的代码 void banner NSString path NSData imageD
  • UITableView:自定义标题标题视图不显示

    我想显示一个带有自定义标题标题的表格 这table view被附加到一个controller class实现了tableview delegate和数据源协议 但不是其子类UIViewController因为该表是要显示在另一个表视图之上的
  • 使用 fread() 选择行和列,就像 read.csv.sql() 那样

    I know fread相对较新 但它确实提供了很大的性能改进 我想知道的是 您可以从您正在阅读的文件中选择行和列吗 有点像什么read csv sql做 我知道使用select的选项fread我们可以选择要读取的列 但是如何只读取满足特定
  • 强类型定义[重复]

    这个问题在这里已经有答案了 有什么方法可以制作类型的完整副本 以便可以在模板推导上下文中区分它们 举个例子 include
  • 如何在连接表中按条件接收对象

    我有桌子Games and Badges他们通过桌子连接BadgesGames t integer badge id t integer game id t boolean shown default false I have Game对象
  • Xcode - 共享应用程序 - PackageApplication 失败,退出代码 1

    我使用 Xcode 4 1 为我的 iPhone 应用程序创建了一个临时发行版 目标成功构建并生成了一个存档文件 我可以在管理器中看到该文件 然后我单击 共享 这允许我选择 ipa 和我的分发配置文件 但是 在我点击 下一步 后 管理器崩溃
  • Spark:按元组/列中的多个值对 RDD 进行排序

    所以我有一个RDD如下 RDD String Int String 举个例子 b 1 a a 1 b a 0 b a 0 a 最终结果应该类似于 a 0 a a 0 b a 1 b b 1 a 我该怎么做这样的事情 尝试这个 rdd sor
  • Heroku/GoDaddy:将裸域名发送到 www [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在尝试找出如何让我的网站的裸域重定向到 www 域 我正在使用 Heroku 并拥有 GoDaddy 的域名 由于 Heroku 我的 A 记录已
  • 没有http服务器的Socket.IO?

    我目前正在使用 Nodejs 的 Socket IO 在服务器和一些客户端之间共享一些实时信息 客户端应该只与服务器通信 而不是彼此通信 在 Windows 上一切都很好 我可以共享信息 但当它把东西放到 Linux vps 上时 我遇到了
  • “在负可变长度后行中使用 \G 来限制后行回溯多远”的示例

    在很棒的正则表达式模块的 pypi 页面中 https pypi python org pypi regex https pypi python org pypi regex 据说 G 可以 在负可变长度后向中使用 以限制后向回溯的距离 非
  • 如何在有或没有 Pig 的情况下使用 Cassandra 的 Map Reduce?

    有人可以解释 MapReduce 如何与 Cassandra 6 配合使用吗 我已经阅读了字数统计示例 但我不太明白 Cassandra 端与 客户端 端发生的情况 https svn apache org repos asf cassan
  • 创建已包含 Nuget 包参考的 Visual Studio 项目模板?

    我想创建一个 Visual Studio 2010 项目模板 它本质上是一个 ASP net 3 5 Webforms 应用程序 但是 我想自动添加 NuGet 包引用 如果需要 我可以将实际的 nupkg 与模板捆绑在一起 但我想知道是否
  • WordPress:“post_name”的 WP_Query 搜索条件

    我正在使用 WP Query 非常标准 一切都很好 但是 我需要进行一项特定的修改 如果用户在 URL 中输入特定的帖子名称 则搜索将仅返回与该 post name 值匹配的帖子 请参阅下面的代码 其中包含有关特定行不起作用的注释
  • MySQL:启用加载数据本地INFILE

    我在 Ubuntu 12 LTS 上运行 Mysql 5 5 我应该如何在 my cnf 中启用 LOAD DATA LOCAL INFILE 我已经尝试在配置中的各个位置添加 local infile 但我仍然收到 此 MySQL 版本不
  • Windows 窗体:进度栏无响应

    我有一个小应用程序来转换多种文件格式 其中一个主窗口窗体包含几个文本框 按钮等 我有另一个 文档 类 它处理所有实际的转换工作 我的窗体基本上迭代所有文件 并调用适当的 Document 方法来转换文件 然而 当这种情况发生时 表单会停止响
  • 从类访问私有模块变量

    我正在尝试理解 python 作用域规则 为此 我尝试从同一模块中的类访问 非常私有 变量 bar bar bar underscore bar double underscore def foo print bar print bar p
  • Google 地图 - 自动完成和方向 API - 触发下拉列表的 onchange() ?

    我有谷歌地图和两个输入 它们都使用自动完成功能 如下所示 first input autocomplete var input1 document getElementById start var autocomplete1 new goo
  • 给定单词相似度推断句子相似度

    假设我对两个句子中的每对单词都有一个单词相似度得分 那么根据这些分数确定整体句子相似度的好方法是什么 单词分数是使用表示每个单词的向量的余弦相似度来计算的 现在我有了单独的单词分数 将单独的单词分数相加并除以两个句子的总字数来获得两个句子的
  • android 片段在方向改变时创建了两次

    我遇到了这个奇怪的问题 我的列表片段被创建了两次 一次是在父活动上调用 super oncreate 时 一次是在同一父活动上调用 setContentView 时 这是一个简单的应用程序 我使用不同的纵向和横向布局 这是主要活动 priv