如何将一个Android碎片添加到一个活动中?

9

我想将一个片段添加到我的主活动中,因此我有这个片段类(TitleFragment.java):

package com.myapp.app1;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

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

接下来是我的碎片的实际内容,包含在fragment_title.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" >
       <ImageView 
        android:id="@+id/logo_iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/logo_main"
        android:contentDescription="@string/app_name"
        android:scaleType="fitStart"
        android:adjustViewBounds="true" />
</LinearLayout>

在我的 activity_main.xml 文件中,我有以下代码段(除了常规内容):

<fragment 
            android:name="com.myapp.app1.TitleFragment"
            android:id="@+id/title_fragment"
            android:layout_width="0dp"
            android:layout_height="match_parent" />

这种方法创建片段是否正确?我的应用程序崩溃了,LogCat似乎表明与充气片段视图有关,但我不确定。
顺便说一下,这个片段的原因是拥有应用程序徽标(图像和一些可更新文本),存在于每个页面上,这是做这样的事情的好方法吗?抱歉我的新手问题。

1
发布您的LogCat堆栈跟踪。而且操作栏已经有应用程序的标志和文本,您可以更改它们。 - A--C
android.developers网站有一个很好的指南。 ::: 并不是“只需”添加一个片段,通常根据屏幕大小和方向创建片段,否则必须创建等效的活动。在指南中,您将找到代码和解释。 - ilomambo
6个回答

13

我已经从我的MainActivity启动了一个片段。主活动扩展FragmentActivity。 我使用的方式是:

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.body_frame, new MyFragment()).commit();

在您的情况下,它应该长这样:

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.title_fragment, new TitleFragment()).commit();

记住我使用了 FragmentActivity 来启动Fragment。我还使用了android-support-v4.jar来支持低版本操作系统中的片段。如果没有android-support-v4.jar,那么FragmentManager manager = getSupportFragmentManager();可能会像这样看起来:FragmentManager manager = getFragmentManager();

编辑:

你应该修改你的片段类:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view =  inflater.inflate(R.layout.fragment_title, container, false);
    // you can use findViewById() using the above 'view'
      ......................
      ....your code........
       ................
    return view;
}

1
我想点赞,但是我的声望不够:( ^_^ 谢谢,我有非常接近这三行的东西,但不完全一样。不过我在想,为了我的目的,我是否应该使用操作栏而不是片段呢?去谷歌看看! - Daniel Wilson
1
我想强调一下一个段落中的内容:如果只针对API 11及更高版本,可以使用MainActivity extends Activity而不是MainActivity extends FragmentActivity。也就是说,Activity现在可以访问Fragments,不再需要FragmentActivity。这种方法不会使用android-support-v4.jar。取而代之的是= getFragmentManager()而不是= getSupportFragmentManager()。我知道这在答案中已经提到了,但很容易忽略或误解所说的内容。 - ToolmakerSteve

6
在片段部分添加以下代码:
tools:layout="@layout/fragment_title"

这里有一个例子:

<fragment 
    android:name="com.myapp.app1.TitleFragment"
    android:id="@+id/title_fragment"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    tools:layout="@layout/fragment_title />

5
你可以简单地这样做,并声明片段的名称:
<androidx.fragment.app.FragmentContainerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="com.example.ExampleFragment" />

1
哇,我的这个愚蠢问题已经快10年了:D 是的,现在这是做它的方式,特别是与导航库一起使用非常有用。 - Daniel Wilson

0

请确保具有 activity_main.xml 布局的活动扩展了 FragmentActivity 而不是 Activity


1
那么,使用AppCompatv7扩展ActionBarActivity呢? - To Kra
@ToKra 应该没问题。ActionBarActivity 是 FragmentActivity 的子类。最近,它已被弃用并转而使用 AppCompatActivity,它也是 FragmentActivity 的子类。 - Anubian Noob
这个答案已经过时了:如果只针对API 11及更高版本,可以使用Activity而不是FragmentActivity - ToolmakerSteve

0

使用标签,您可以在活动中添加/替换片段

private final static String BLANK_FRAGMENT_A= "BlankFragmentA";
private final static String BLANK_FRAGMENT_B= "BlankFragmentB";

private BlankFragmentA blankFragmentA;
private BlankFragmentB blankFragmentB;

添加 Fragment

blankFragmentA= (BlankFragmentA) getSupportFragmentManager().findFragmentByTag(BLANK_FRAGMENT_A);
if (blankFragmentA== null) {
   blankFragmentA= new BlankFragmentA ();
   getSupportFragmentManager().beginTransaction().add(R.id.frame_layout,blankFragmentA,BLANK_FRAGMENT_A).commit();
}

替换片段

blankFragmentB= (BlankFragmentB) getSupportFragmentManager().findFragmentByTag(BLANK_FRAGMENT_B);
if (blankFragmentB== null) {
   blankFragmentB= new BlankFragmentB();
   getSupportFragmentManager().beginTransaction().replace (R.id.frame_layout,blankFragmentB,BLANK_FRAGMENT_B).commit();
}

0
public void onMenuItemClick(View clickedView, int position) {
    switch (position){
        case 1:
             fragmentChanger("Notifications",new notifyFragment());
           break;
        case 2:
             fragmentChanger("QR Code",new qrFragment());
            break;
        case 3:
            fragmentChanger("User ID",new MainFragment());
            break;
        case 4:
            fragmentChanger("Settings",new settingsFragment());
            break;
        default:
            Toast.makeText(this, "Clicked on position: " + position, Toast.LENGTH_SHORT).show();
            break;
    }
}

//function that does the trasaction when a fragment object is passed
//R.id.container is my default frame
public void fragmentChanger(String title, Object expectedFragment){
   // mToolBarTextView.setText(title);
    transaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.container, (Fragment) expectedFragment);
    transaction.addToBackStack(null);
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    transaction.commit();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接