繁体   English   中英

单击一个按钮以打开片段?

[英]Click a button to open a Fragment?

我有一个ViewPager,可以在其中创建的4个不同选项卡(片段)之间进行查看。 在我的一个片段中,我想要一个按钮,在单击该页面上的按钮后,该视图将被另一个片段替换。 现在,我不想滑动到另一个选项卡,我只想在按该按钮时替换当前片段的视图。 这是我的尝试,但是我不确定为什么单击按钮时什么也没发生。 如果有人可以帮助我,那就太好了。 谢谢!

这是我用来创建视图的片段以及我要按下的按钮。

ManualSelection.java

public class ManualSelection extends Fragment {

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.activity_manual_selection, container, false);
        intent = new Intent(getActivity(), ManualSelectionListView.class);
        return rootView;
    }

    public void onActivityCreated (Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Button listViewGenerated = (Button) getActivity().findViewById(R.id.manual_generate);
        listViewGenerated.setOnClickListener(new View.OnClickListener() {
            @TargetApi(Build.VERSION_CODES.HONEYCOMB)
            @Override
            public void onClick(View v) {
                FragmentManager fm = getActivity().getFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                ft.replace(R.id.listView_manual, new ManualSelectionListView());
                ft.commit();
            }

        });
    }
}

这是我要创建的片段

ManualSelectionListView.java

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class ManualSelectionListView extends Fragment {

static final String[] MOBILE_OS =
        new String[] { "Android", "iOS", "WindowsMobile", "Blackberry"};

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.listview, container, false);

    ListView lv = (ListView)rootView.findViewById(R.id.listview);
    lv.setAdapter(new MobileArrayAdapter(getActivity(),MOBILE_OS));

    return rootView;
}
}

这是我的XML文件:

activity_manual_selection.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.ecs160.homestay.ManualSelection"
    android:id="@+id/fragmentTest"> 

 <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Generate"
    android:id="@+id/manual_generate"
    android:layout_centerHorizontal="true"
    android:onClick="generateListView"/>

这是一个名为listview.xml的XML文件,其中包含R.id.listView_manual

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/listView_manual">

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

</LinearLayout>

当我点击“生成”时,我什么也没显示。 有任何想法吗? 谢谢!

在您的活动中,您应该创建以下代码:

public void generateListView(View v){
    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.listView_manual, new ManualSelectionListView());
    ft.commit();
}

问题是您正在尝试从主要活动中获取Button ID,该按钮将返回null

        Button listViewGenerated = (Button) getActivity().findViewById(R.id.manual_generate);

按钮manual_generate位于您的activity_manual_selection布局中,而不位于主活动的布局中,您无法从其他布局中获取视图,否则它将返回null

解:

从片段的布局中获取Button的ID

public class ManualSelection extends Fragment {

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                     Bundle savedInstanceState) {

    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.activity_manual_selection, container, false);
    intent = new Intent(getActivity(), ManualSelectionListView.class);

   Button listViewGenerated = (Button) rootView.findViewById(R.id.manual_generate);
    listViewGenerated.setOnClickListener(new View.OnClickListener() {
        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        @Override
        public void onClick(View v) {
            FragmentManager fm = getActivity().getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            ft.replace(R.id.listView_manual, new ManualSelectionListView());
            ft.commit();
        }

    });

    return rootView;
}

删除onActivityCreated

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM