【问题标题】:Programmatically add fragments to viewgroup以编程方式将片段添加到视图组
【发布时间】:2012-03-01 04:10:04
【问题描述】:

基本上这是我的平板电脑横向应用程序(想法): 两个片段,左侧片段是由 resource.xml 文件填充的列表片段(可以正常工作)。

正确的片段应该根据用户单击的列表项动态更改片段和布局。到目前为止,谷歌搜索告诉我,我需要以编程方式向视图组添加和删除片段才能做到这一点。对吗?

基本上问题是/是:

  1. 如何创建视图组以及在哪里(Main.java 或 menufragment.java)?
  2. 如何将动态“用户点击 ID 3 放在列表中,因此将片段 3 添加到视图组”
  3. 我要向我的 main.xml 文件添加什么?得到了 listfragment 的片段,要为动态视图组添加什么?

编辑:

这就是我的活动的样子: 主.java

public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    }
}

这是我的列表片段 MenuFragment.java

public class MenuFragment extends ListFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.listfragment, container, false);

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

    setListAdapter(new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1,
            getResources().getStringArray(R.array.listmenu)));
    }    



    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub
        super.onListItemClick(l, v, position, id);
        Main activity = (Main) getActivity();
    }


}

最后是我的 main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<fragment
    android:id="@+id/list"
    android:layout_width="200dp"
    android:layout_height="fill_parent"
    android:layout_alignParentTop="true"
    android:layout_weight="1"
    class="com.mwerner.fragmentstest.MainMenu" />

<View
    android:id="@+id/contentview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@+id/list" />

</RelativeLayout>

我在填充列表的 xml 文件中的字符串数组称为“listmenu”

请告诉我我需要把你写下的代码放在哪里?

【问题讨论】:

  • ViewGroup 只是一个容器,类似于 LinearLayout 或 RelativeLayout。应将其添加到 Activity 布局文件 (res/layout/activity.xml)。给你的 ViewGroup 一个 id,然后你可以使用 findViewById 方法引用它。

标签: android android-fragments viewgroup


【解决方案1】:

看看这些片段主题:

基本上你会想让 left 片段告诉父 Activity 选择了哪个项目。然后,Activity 可以在右侧窗格中添加/删除正确的片段。

请记住,创建/销毁 Fragment 对系统来说是一项繁重的工作。如果您可以在右侧窗格中使用单个 Fragment,那么效率会高得多。然后,您可以在该 Fragment 实例上调用方法,而无需构建新的 Fragment。

编辑(示例):

您使用自定义方法的 Main Activity 实现:

public class Main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    /** Called by the left fragment */
    public void updateRightPane(long id) {
        // Get the data with the selected item id
        // ...

        // Create a new fragment
        MyFragment fragment = new MyFragment(data);

        // Update the layout
        FragmentManager fm = getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();

        // The id specified here identifies which ViewGroup to
        // append the Fragment to.
        ft.add(R.id.view_group_id, fragment);
        ft.commit();
    }
}

MenuFragment.javaonListItemClick 实现:

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    // Get the parent Activity
    Main activity = (Main) getActivity();

    // Pass the selected item id to the Activity method
    // Note: Feel free to update this method to accept additional
    //       arguments (e.g. position).
    activity.updateRightPane(id);
}

最后,你的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/view_group_id"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <!-- More views here... -->

</RelativeLayout>

【讨论】:

  • 谢谢,只是跟进:1)我如何告诉我的listfragment中的onlistitemclick更改右窗格视图以加载另一个片段和布局? 2)我不需要销毁片段,如果这对内存更容易,我可以将它们放在后台堆栈中。基本上我只想在右侧显示一个“DetailsFragment”,即用户在列表中单击的最后一个。
  • 您的 ListFragment 有一个 [getActivity][1] 方法。您可以在主机 Activity 上编写一个公共方法,该方法接受一些参数并在调用时更改右窗格。从左侧 Fragment 的 onListItemClick 侦听器调用 getActivity 并将结果转换为父 Activity 类型。然后调用您的公共方法。像updateDetailsPane(long id) 这样的东西应该可以工作。 MyActivity activity = (MyActivity) getActivity();[1]:developer.android.com/reference/android/app/…
  • 我在编辑中发布了我的代码,我从逻辑上理解你所说的,但不知道如何以代码方式实现它。请帮助:S
  • 我用一个示例实现更新了我的答案。让我知道它是否有效!
  • @twaddintgton 非常感谢,您有几条讨厌的红线,1)我假设您何时将数据放在括号中,我假设您的意思是 id 不是数据?我没有看到任何定义为变量的数据,2)MyFragment 无法解析为类型,这是什么意思?我应该将其更改为 ViewerFragment 吗?我有一个名为 ViewerFragment.java 的片段,位于 3) ft.add(R.id.view_group_id, fragment);它说 view_group_id 无法解析或不是字段。请在这里提供一点理论...我假设您的意思是我需要将所有可能的布局放在 main.xml 文件中,以等待它们膨胀?
猜你喜欢
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 2017-10-09
相关资源
最近更新 更多