【问题标题】:Click a button to open a Fragment?单击按钮打开片段?
【发布时间】:2014-07-28 22:01:39
【问题描述】:

我有一个 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>

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

【问题讨论】:

  • 是发生的点击事件。尝试将点击事件保留在 onstart 中,而不是我所做的
  • @IllegalArgument 当我尝试打开 ViewPager 时会产生错误
  • @IllegalArgument 没有错误,当我按下按钮时没有任何反应,我不知道为什么。

标签: java android xml android-fragments


【解决方案1】:

在你的活动中你应该创建这个:

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

【讨论】:

    【解决方案2】:

    问题是您试图从您的主要活动中获取按钮 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

    【讨论】:

    • 我尝试实现您的更改,但是当我单击按钮时,没有像以前那样发生任何事情。任何想法为什么?
    • @user1567909 如果点击正在发生,请尝试在 onClick 内部进行调试
    • 我怀疑你是否看到了按钮,如果你先在列表视图中应用点击事件,然后逐步尝试按钮
    • @Rod_Algonquin 我只是在 onClick 里面放了一个调试语句,点击确实发生了。我认为这与我如何进行片段管理...或我如何替换视图有关...有关如何解决此问题的任何想法?
    • @user1567909 R.id.listView_manual 是错误的,它应该是您活动布局中的 id
    猜你喜欢
    • 1970-01-01
    • 2015-09-05
    • 2015-12-18
    • 2021-10-03
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多