【问题标题】:Android Fragment : bug fix explanationAndroid Fragment:错误修复说明
【发布时间】:2012-07-13 21:48:46
【问题描述】:

我开始使用 Fragments,我已经按照 API 指南的方式完成了,但是……当然这太容易了;) 当我启动应用程序时,它崩溃了。经过一番研究,我发现了这篇文章Android fragment is not working 斯蒂芬怀利的回应似乎纠正了阿里的问题,但是..我不明白! 我应该把 FrameLayout 放在哪里? “where_i_want_my_fragment” id...这是我想要的任何东西,对吧? 最后我应该把Java代码放在哪里?在我的活动中(顺便显示了 2 个片段)。

谢谢!

尼哥

编辑:让我们说一下我想要的设计,我认为你会更好地理解。 我想要一个在左侧显示字符串列表的列表片段,在右侧我想要一个片段显示有关列表中所选字符串的信息。而且我希望能够在我的应用程序的右侧用手指动作滑动(我不知道滑动片段或其他什么更好。它是相同的布局,但填充了不同的数据)

好的,我只是发布我的代码,因为我真的不明白为什么它没有做任何事情。 这是我的 activity_main.xml

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

<FrameLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_frag"
    android:name="main.courante.c.DateListFragment"
    android:layout_width="fill_parent"
    android:layout_height="match_parent" >
</FrameLayout>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fiche_frag"
    android:name="main.courante.c.fiche_frag"
    android:layout_weight="2"
    android:layout_width="0dp"
    android:layout_height="match_parent" >
</FrameLayout>

</LinearLayout>

这是我的主要活动: 公共类 MainActivity 扩展 Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    DateListFragment fragment = new DateListFragment();
    getFragmentManager().beginTransaction().add(R.id.list_frag, fragment).commit();
    fiche_freg frag2 = new fiche_frag();
    getFragmentManager().beginTransaction().add(R.id.fiche_frag,frag2).commit();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

这里是 DateListFragment(没有 onCreateView,因为它是自动生成的)

public class DateListFragment extends ListFragment {
private int mposition = 1;
private String[] mListItem = new String[] {
        "Lundi 9 Juilllet",
        "Mardi 10 Juillet",
        "Mercredi maintenant"
};
@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    this.setListAdapter(new ArrayAdapter<String>
                     (this.getActivity(),R.layout.frag_list_view ,mListItem));
    this.getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
}

这里是 fiche_frag : 公共类 fiche_frag 扩展片段 {

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    return inflater.inflate(R.layout.checks_matin,container,false);
}

R.layout.checks_matin 单独工作正常。

我已经再次感谢您的帮助。我是 android 环境的初学者,我发现很难同时了解 UI 的所有概念......!

【问题讨论】:

  • 如果您打算使用活动来放入片段,您应该从 xml 中删除 android:name 标签。
  • 我也会在片段中使用onActivityCreated,而不是onCreate
  • Fragment docs 的链接可能会有所帮助。
  • 哇太棒了!!!它显示了一些东西! =) 我把我的运气推得更远了,我问你一些别的问题:我怎样才能改变我右边片段内的布局?因为在这里我在框架布局中使用片段,所以我的片段没有 id 或标签,因为它不在 xml 中,所以我该如何按标签或 id 检索我的片段(只有那两个)?例如,当我单击一个按钮时,我希望它改变我的右侧片段的布局。但也许我的设计不好。
  • 不过还是非常感谢。在这方面花费的时间比我想象的要多得多..

标签: android android-fragments


【解决方案1】:

您了解基础知识。 FrameLayout 去任何你想让你的片段去的地方。我之前在整个屏幕只有一个 FrameLayout 的情况下做到了这一点,并且我在其中交换了多达五个不同的片段。

如果您有两个片段要同时显示,您可以使用两个FrameLayouts 来制作主布局。但是,这意味着您一直被锁定为同时拥有两者(或者如果您删除一个空间,则为空白。

如果您希望两个片段不必同时出现在屏幕上,您可以使用单个 FrameLayout 并编写代码以根据需要交换片段。

实例化片段的代码应始终位于控制活动中(如果它们是动态的)。

没有代码和更具体的问题,以上是我能给你的最好答案。

编辑

将两个片段并排放置的示例主布局:

<?xml version="1.0" encoding="utf-8"?>
...
    <LinearLayout
        android:id="@+id/frames"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/hline1"
        android:layout_below="@id/horizontalline"
        android:orientation="horizontal" >
        <FrameLayout
            android:id="@+id/leftpane"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight=".4" />
        <FrameLayout
            android:id="@+id/rightpane"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1" >
        </FrameLayout>
    </LinearLayout>
...

要将您的片段添加到其中一个框架布局中:

FragmentClass fragment = new FragmentClass();
getFragmentManager().beginTransaction().add(R.id.leftpane, fragment).commit();

如果你想在其中一个框架布局中交换片段(比如左窗格),你可以这样做:

FragmentClass fragment = new FragmentClass();
getFragmentManager().beginTransaction().replace(R.id.leftpane, fragment).commit();

我建议从 XML 进行实例化,因为听起来您将拥有两个片段并且不进行任何更改。如果您打算将它们换入和换出,那么最好为每个标签添加一个标签,以便在您想再次显示它们时再次找到它们。

【讨论】:

  • 就是这样。因此,如果我希望两个片段始终存在,我只需创建一个由两个 FrameLayout 组成的布局(例如,xml 文件中的线性布局)。我用这种布局创建了一个主要活动,并在主要活动的 onCreate / resume 函数中放置了 java 代码。我理解对了吗?好吧,我会测试它。非常感谢!!
  • 你明白了。 :) 您也可以将android:name="your.package.name.fragmentclassname 放在框架布局中(使用适当的不同片段类名称),这将导致在布局膨胀时自动实例化片段,因此您不需要在主目录中放置任何代码setContentView以外的活动。
  • 哦,如果答案对您有所帮助并且您已经解决了您的问题,您应该接受它(单击它旁边的复选标记)。这让每个人都知道您的问题已得到解决,并为帮助您的人表示感谢。
  • 我应该把片段的标签放在哪里?如果它们不在 xml 中。
  • 好的,如果我不需要放置任何代码,我也不需要标签......还是我?当我想改变一个片段的内容时,我应该怎么做?如何检索我的片段?
猜你喜欢
  • 1970-01-01
  • 2020-12-05
  • 2014-07-26
  • 2013-08-08
  • 1970-01-01
  • 2012-06-17
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多