1

我想實現Commonsware CWAC-Camera,並且遇到了將它合併到現有片段中的問題。Commonsware CWAC切換片段

我遇到了一個問題,我無法使用.add或.replace,它希望將CameraFragment更改爲Fragment。

錯誤:

The method add(int, Fragment, String) in the type FragmentTransaction is not applicable for the arguments (int, CameraFragment, String)

<uses-sdk 
    android:minSdkVersion="13" 
    android:targetSdkVersion="21" /> 


import java.io.File; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.ImageButton; 

import com.commonsware.cwac.camera.CameraFragment; 




public void takePicture() { 

    CameraFragment f = new CameraFragment(); 
    getFragmentManager().beginTransaction() 
      .add(R.id.contentFragment, f, TAG_CAMERA_FRAGMENT) 
      .commit(); 
} 

有沒有人經歷過這個?這是整個片段。

public class FeedActivity extends Fragment implements OnClickListener { 

    ImageButton btnCamera, btnGallery; 
    private final String TAG_CAMERA_FRAGMENT = "camera_fragment"; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.activity_feed, container, false); 

     btnCamera = (ImageButton) view.findViewById(R.id.btn_Camera); 
     btnCamera.setOnClickListener(this); 
     btnGallery = (ImageButton) view.findViewById(R.id.btn_Gallery); 
     btnGallery.setOnClickListener(this); 

     return view; 
    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     switch (v.getId()) { 

     case R.id.btn_Camera: 
     Log.e("CAMERA", "CAMERA BUTTON PRESSED"); 
      //takePicture(); 
      break; 

     case R.id.btn_Gallery: 
      Log.e("Gallery", "GALLERY BUTTON PRESSED"); 
      break; 

     } 

    } 

    public void takePicture() { 

     CameraFragment f = new CameraFragment(); 
     getFragmentManager().beginTransaction() 
       .add(R.id.contentFragment, f, TAG_CAMERA_FRAGMENT) 
       .commit(); 
    } 
} 
+0

「我不能使用。新增或.replace,並要我改變CameraFragment到碎片」 - 我不知道你這是什麼意思。請提供確切的消息,並指出是什麼給你的信息(一個IDE?LogCat?別的?)如果我不得不猜測,你有錯誤的導入,並試圖將片段backport與本地API Level 11+片段混合,但這只是一個猜測。 – CommonsWare 2014-09-23 13:37:46

+0

類型FragmentTransaction中的方法add(int,Fragment,String)不適用於參數(int,CameraFragment,String) – 2014-09-23 13:44:23

+0

我剛纔包含了錯誤。快速修復閱讀「將f更改爲碎片」。我很抱歉。 – 2014-09-23 13:49:58

回答

1
import android.support.v4.app.Fragment; 

和:

import com.commonsware.cwac.camera.CameraFragment; 

是不相容的。您需要決定是要使用Android支持包中的片段backport,還是要使用本機API Level 11+片段。而且您需要修改整個活動以支持您的選擇(例如,如果使用backport,則從FragmentActivity繼承)。

如果你想使用backport,你需要使用camera-v9庫和導入com.commonsware.cwac.camera.acl.CameraFragment,雖然這也使用ActionBarSherlock。如果你想要分段的backport而不是ActionBarSherlock,你需要分叉一個CameraFragment實現來支持這個組合。

+0

非常有幫助。謝謝。 – 2014-09-23 14:06:28

0

問題

我想告訴你我的方式來解決CameraFragment不兼容的問題。我的應用程序使用V4支持庫(不知何故,我不知道爲什麼),但沒有ActionBarSherlock。因爲我的目標平臺是V11及以上版本(是的,不支持2.3及以下版本)。

  • com.commonsware.cwac.camera.CameraFragment - >不與V4支持庫兼容,因此不符合我們的V4 FragmentActivity和其他碎片兼容。

  • com.commonsware.cwac.camera.acl.CameraFragment - >將不起作用,因爲我沒有ActionBarSherlock。

公共解

通常,應用程序將有大量的碎片和一些與列表或網格。他們都有一些共同的功能。我們可能會使用靜態utils類,但它可能會產生比解決問題更多的問題。例如,它需要在函數調用中傳遞this片段指針。最後,我們有這些:

java.lang.Object 
↳ android.support.v4.app.Fragment 
    ↳ com.example.app.BaseFragment   <- with common functions 

java.lang.Object 
↳ android.app.Fragment 
    ↳ android.app.ListFragment 
    ↳ com.example.app.BaseListFragment  <- with common functions 

java.lang.Object 
↳ android.app.Fragment 
    ↳ com.commonsware.cwac.camera.CameraFragment 
    ↳ com.example.app.BaseCameraFragment <- with common functions 

問題

  • 中產階級片段可以從不同的片段擴展:原創或V4支持庫。
  • 在這些Base ... Fragment類中有多個常用函數副本。維護困難且浪費時間。

不過,我注意到這些片段我們從延長出頭:

  1. 他們很好完成的,並不太可能改變。
  2. 他們大多是開源的。
  3. 他們通常不會在乎他們的父母是原創還是V4支持 - 他們自己工作。

解決方案

因此,而不是從他們身上延伸,我們可以(一)改變他們的父類,或(b)克隆它們和擴展我們喜歡的任何片段:

java.lang.Object 
↳ android.support.v4.app.Fragment 
    ↳ com.example.app.BaseFragment   <- with common functions 
    ↳ com.example.app.BaseListFragment  
     // with content from android.app.ListFragment 
    ↳ com.example.app.BaseCameraFragment 
     // with content from com.commonsware.cwac.camera.CameraFragment 

(請注意,我們還是要遵循GNU許可證如適用)

通常情況下,我不想改變自己的源代碼,所以我可以很容易地升級到最新版本可用時。所以,我會保留原來的應用程序,並使用方法b。唯一的工作是將它們的版本與我的克隆進行比較。

優點

  1. 保持與通用功能的一個片段。
  2. 解決基本類型不兼容問題。
  3. 易於更改基礎片段類型。
  4. (對於CWAC)我可以避免camera-v9這需要ActionBarSherlock,並且我已將所有片段從v4片段擴展。

享受〜

+0

關於爲什麼我使用v4片段,即使min-target是Android 4.0+:有一天,我的隊友告訴我,在某些早期版本(如4.0)中,他們的內置片段存在問題。使用v4支持庫更爲明智。以便該應用程序將使用碎片固定版本和FragmentActivity。如我錯了請糾正我。因爲我認爲使用V4庫沒有什麼壞處,所以...... – 2014-12-12 08:01:19