【问题标题】:How to add an Android fragment to an activity?如何将 Android 片段添加到活动?
【发布时间】:2013-02-03 16:11:08
【问题描述】:

我想在我的主要活动中添加一个片段,所以我有这个片段类(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 中,我在活动的常规内容中有这个 sn-p:

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

这种方法是创建片段的正确方法吗?我的应用程序崩溃了,LogCat 似乎表明它与片段视图膨胀有关,但我不确定。

顺便说一句,这个片段的原因是每个页面上都存在应用程序徽标(图像和一些可更新的文本),这是一个很好的方法来做这样的事情吗?对不起,我的新手问题。

【问题讨论】:

  • 发布您的 LogCat 堆栈跟踪。并且 Action Bar 已经有您可以更改的应用徽标和文本。
  • android.developers 网站有一个很好的指南。 ::: 没有“只是”添加片段这样的事情,通常片段是根据屏幕大小和方向创建的,否则必须创建等效的活动。在指南中,您将找到代码和解释。

标签: android xml layout android-activity fragment


【解决方案1】:

我已经从我的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.jarFragmentManager 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;
}

【讨论】:

  • 我会投票,但我没有足够的代表 :( ^_^ 谢谢,我有一些非常接近这三行但不完全的东西。我想知道我是否应该使用操作栏而不是我的目的的片段?去谷歌!
  • 我想强调一段中隐藏的内容:如果只针对 API 11 和更新版本,可以使用 MainActivity extends Activity 而不是 MainActivity extends FragmentActivity。即Activitys可以访问Fragments,不再需要FragmentActivity。这种方法不会使用 android-support-v4.jar。代替= getSupportFragmentManager(),使用= getFragmentManager()。我知道答案中提到了这一点,但很容易忽略或误解所说的内容。
【解决方案2】:

在片段部分添加

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 />

【讨论】:

    【解决方案3】:

    您可以像这样简单地执行此操作并声明片段的名称:

    <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" />
    

    【讨论】:

    • 哇,我这个愚蠢的问题已经有将近 10 年的历史了:D 是的,这就是现在的方法,特别适用于导航库
    【解决方案4】:

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

    【讨论】:

    • 用 AppCompatv7 扩展 ActionBarActivity 怎么样
    • @ToKra 应该没问题。 ActionBarActivity 是 FragmentActivity 的子项。最近,它已被弃用并遵从 AppCompatActivity,它也是 FragmentActivity 的子项。
    • 此答案已过时:如果仅针对 API 11 和更高版本,则可以使用 Activity,而不是 FragmentActivity
    【解决方案5】:
    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();
    }
    

    【讨论】:

      【解决方案6】:

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

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

      添加片段

      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();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多