之前曾有人问过这个问题,但是我没有找到合适的答案。我正在构建一个简单的片段活动,该活动在一个容器中的屏幕顶部显示三个按钮,按下该按钮将更新屏幕其余部分中的片段。就像标签主机一样。我在所有代码中都使用android.support.v4.app.Fragment,但仍无法使事务管理器在容器中显示该片段。我一直在敲键盘,好几个小时都没发现问题。

这是扩展FragmentActivity的主要活动:

package com.example.testudpfragment;

import com.example.testudp.R;

import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

public class TestUDPFragmentActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_udpfragment);

        if(savedInstanceState == null)  {
            getSupportFragmentManager().beginTransaction()
                .add(R.id.menu_container, new MenuFragment()).commit();

        }
    }
}


这是MenuFragment类扩展我的选项卡的片段:

package com.example.testudpfragment;

import com.example.testudp.R;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.support.v4.app.*;

public class MenuFragment extends Fragment{

    Fragment frag;
    FragmentTransaction fragTransaction;

    public MenuFragment()   {

    }

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

        View view = inflater.inflate(R.layout.frament_menu, container, false);

        frag = new StringsFragment();
        fragTransaction = getFragmentManager().beginTransaction().add(R.id.container, frag);
        System.out.println(fragTransaction.toString());
        fragTransaction.commit();

        Button btnString = (Button) view.findViewById(R.id.button_string);
        Button btnSlider = (Button) view.findViewById(R.id.button_slider);
        Button btnTouch = (Button) view.findViewById(R.id.button_touch);



        btnString.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                frag = new StringsFragment();
                fragTransaction = getFragmentManager().beginTransaction().replace(R.id.container, frag);

                fragTransaction.commit();

            }
        });



        btnSlider.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                frag = new SlidersFragment();
                fragTransaction = getFragmentManager().beginTransaction().replace(R.id.container, frag);
                fragTransaction.commit();

            }
        });



        btnTouch.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                frag = new TouchFragment();
                fragTransaction = getFragmentManager().beginTransaction().replace(R.id.container, frag);
                fragTransaction.commit();

            }
        });
        return view;
    }
}


这是我无法显示的三个片段之一:

package com.example.testudpfragment;

import com.example.testudp.R;

import android.support.v4.app.*;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class StringsFragment extends Fragment   {

    public StringsFragment()    {

    }

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

        View rootView = inflater.inflate(R.layout.fragment_strings, null);

        return rootView;
    }
}


activity_test_udpfragment:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<FrameLayout
    android:id="@+id/menu_container"
    android:background="#eee"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

</FrameLayout>

<FrameLayout
    android:id="@+id/container"
    android:background="#aaa"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</FrameLayout>

</LinearLayout>


这是frament_menu:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
style="android.att/buttonBarStyle" >``

<Button
    android:id="@+id/button_string"
    style="android.att/buttonBarButtonStyle"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="String" />

<Button
    android:id="@+id/button_slider"
    style="android.att/buttonBarButtonStyle"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="Slider" />

<Button
    android:id="@+id/button_touch"
    style="android.att/buttonBarButtonStyle"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="Touch" />

</LinearLayout>


这是fragment_strings:

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">


<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:scaleType = "centerCrop"
    android:src="@drawable/me_hooded" />

</RelativeLayout>


任何帮助是极大的赞赏!

编辑:
这是新的TestUDPActivityFragment,带有用于更改片段的按钮:

package com.example.testudpfragment;

import com.example.testudp.R;

import android.support.v4.app.*;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.os.Bundle;

public class TestUDPFragmentActivity extends FragmentActivity {
Fragment frag;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test_udpfragment);

    Button btnString = (Button)findViewById(R.id.btn_string);
    Button btnSlider = (Button)findViewById(R.id.btn_slider);
    Button btnTouch = (Button)findViewById(R.id.btn_touch);


    if(savedInstanceState == null)  {
        getSupportFragmentManager().beginTransaction().add(R.id.container, new StringsFragment()).commit();

    btnString.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            frag = new StringsFragment();
            getSupportFragmentManager().beginTransaction().replace(R.id.container, frag).commit();
            }
    });

    btnSlider.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            frag = new SlidersFragment();
            getSupportFragmentManager().beginTransaction().replace(R.id.container, frag).commit();
            }
    });

    btnTouch.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            frag = new TouchFragment();
            getSupportFragmentManager().beginTransaction().replace(R.id.container, frag).commit();
            }
    });



    }
}


}

最佳答案

我可以看到几个问题...

首先,您的FrameLayout容器在activity_test_udpfragment.xml布局文件中定义,该文件由TestUDPFragmentActivity夸大。使用以下方法尝试在StringsFragment代码中创建/添加MenuFragment的问题...

fragTransaction = getFragmentManager().beginTransaction().add(R.id.container, frag);


...是MenuFragment使您的frament_menu.xml布局夸大,其中不包含ID为FrameLayoutR.id.container

那是您的第一个问题,但第二个问题是首先尝试使用Fragment创建/添加Fragment。您的MenuFragment无法使用Framelayout中的TestUDPFragmentActivity

简而言之,我怀疑您希望两个Fragments都出现在您的Activity布局中(并且不希望StringsFragment作为MenuFragment的“子级”),在这种情况下,您需要放置所有用于创建/添加的代码将两个Fragments都输入到您的Activity中。

09-30 09:53