2013-02-19 74 views
1

我想一个片段添加到我的主要活动,所以我有这样的片段类(TitleFragment.java):如何将Android片段添加到活动?

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的堆栈跟踪。而Action Bar已经有了可以更改的应用程序徽标和文本。 – 2013-02-19 04:10:58

+0

android.developers网站有很好的指导。 :::没有这样的事情,只是添加一个片段,通常片段是根据屏幕大小和方向创建的,否则必须创建一个等效的活动。在指南中您将找到代码和解释。 – ilomambo 2013-02-19 04:41:16

回答

7

我已经从我的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; 
} 
+1

我会投这个,但我没有足够的代表:(^ _ ^谢谢,我有一些非常接近这三条线,但不是很完美我不知道我是否应该使用操作栏而不是我的目的片段 – 2013-02-19 12:40:24

+1

我想强调一段内容:如果只针对API 11和更新,可以使用MainActivity扩展Activity而不是MainActivity扩展FragmentActivity,也就是说,'Activity'可以访问片段,不再需要'FragmentActivity'。这种方法不会使用android-support-v4.jar。而不是'= getSupportFragmentManager()',执行'= getFragmentManager()'。我知道答案中提到了这一点,但很容易忽视或误解所说的内容。 – ToolmakerSteve 2015-09-21 14:05:43

0

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

+1

以及如何使用AppCompatv7扩展ActionBarActivity – 2015-03-20 10:25:22

+0

@ToKra这应该没问题。 ActionBarActivity是FragmentActivity的一个子项。最近,它已被弃用,并推迟到AppCompatActivity,它也是FragmentActivity的子项目。 – 2015-07-18 16:08:16

+0

这个答案已经过时了:如果只针对API 11和更新版本,可以使用'Activity',而不是'FragmentActivity'。 – ToolmakerSteve 2015-09-21 14:01:42

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