无法在按钮单击时替换片段

时间:2014-07-21 05:45:01

标签: java android

我试图学习如何在android中实现片段。 所以,我在activity_main.xml中创建了两个按钮和一个片段。 如果我点击第一个按钮,fragment_one应该膨胀, 同样,如果我点击第二个按钮,fragment_two应该膨胀。

但问题是它没有取代片段。 当我调试代码时,View.class中的performClick()方法返回false。

LogCat也没有错误。

我无法弄清楚代码的问题。

这里是activity_main.xml

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

<Button
    android:id="@+id/button1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/fragment1" />

<Button
    android:id="@+id/button2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/fragment2" />

<fragment
    android:id="@+id/fragment_place"
    android:name="com.example.myfragmentwithbuttonapp.FragmentTwo"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</LinearLayout>

这里是fragment_one.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" 
android:orientation="vertical"
android:background="#00ffff">

   <TextView
       android:id="@+id/textView1"
       android:layout_width="match_parent"
       android:layout_height="0dp"
       android:layout_weight="1"
       android:text="@string/thisisfragment1"
       android:textStyle="bold" />

</LinearLayout>

这里是fragment_two.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" 
android:orientation="vertical"
android:background="#ffff00">

   <TextView
       android:id="@+id/textView2"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:text="@string/thisisfragment2"
       android:textStyle="bold" />

</LinearLayout>

这里是FragmentOne.java

package com.example.myfragmentwithbuttonapp;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FragmentOne extends Fragment {
  @Override
  public View onCreateView(LayoutInflater inflater,
     ViewGroup container, Bundle savedInstanceState) {

     //Inflate the layout for this fragment

     return inflater.inflate(
          R.layout.fragment_one, container, false);
  }
}

这里是FragmentTwo.java

package com.example.myfragmentwithbuttonapp;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


public class FragmentTwo extends Fragment{
    @Override
    public View onCreateView(LayoutInflater inflater,
       ViewGroup container, Bundle savedInstanceState) {

       // Inflate the layout for this fragment

       return inflater.inflate(
          R.layout.fragment_two, container, false);
   }
}

这是MainActivity.java

package com.example.myfragmentwithbuttonapp;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
    Fragment fr;
    FragmentManager fm;
    FragmentTransaction fragmentTransaction;

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

        setContentView(R.layout.activity_main);
        Button button1 = (Button) findViewById(R.id.button1);
        Button button2 = (Button) findViewById(R.id.button2);

        button1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                fr = new FragmentOne();

                fm = getFragmentManager();
                fragmentTransaction = fm.beginTransaction();
                fragmentTransaction.replace(R.id.fragment_place, fr);
                fragmentTransaction.commit();

            }
        });

        button2.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                fr = new FragmentTwo();

                fm = getFragmentManager();
                fragmentTransaction = fm.beginTransaction();
                fragmentTransaction.replace(R.id.fragment_place, fr);
                fragmentTransaction.commit();

            }
        });
    }

}

我希望我能够解释这个问题。

感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:1)

对于fragmentTransaction.replace(),您需要为片段和片段本身指定容器。容器是将保存片段的父视图。简单地说是FrameLayout。

现在您将R.id.fragment_place作为容器传递,但该id指的是片段而不是片段容器。

在activity_main.xml中,替换:

<fragment
android:id="@+id/fragment_place"
android:name="com.example.myfragmentwithbuttonapp.FragmentTwo"
android:layout_width="match_parent"
android:layout_height="match_parent" />

使用:

<FrameLayout
    android:id="@+id/fragment_place"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

这样工作得很好。其余的代码都没问题。