2013-02-19 76 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(); 
}