1

Commonsware CWAC-Camera를 구현하려고하는데 기존 단편에 통합하는 데 문제가 있습니다.Commonsware CWAC 스위칭 단편

.add 또는 .replace를 사용할 수없는 문제가 발생하며 CameraFragment를 Fragment로 변경해야합니다.

ERROR

:

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

"나는 .add 또는 .replace 사용할 수 없으며 그것은 나를 조각에 CameraFragment을 변경하고자"즐기 - 나는 당신이 무슨 뜻인지 모르겠어요. 정확한 메시지를 제공하고 무엇이 메시지를 표시하는지 알려주십시오 (IDE? LogCat? 다른 것?) 내가 추측해야만 한 것은 잘못된 가져 오기가 있으며 조각 백 포트와 기본 API 수준 11+ 조각을 혼합하려고 시도하는 중입니다. 그러나 그것은 단지 추측입니다. – CommonsWare

+0

FragmentTransaction 형식의 add (int, Fragment, String) 메서드는 인수 (int, CameraFragment, String)에 적용 할 수 없습니다. –

+0

방금 ​​오류가 포함되었습니다. 빠른 수정은 "f를 Fragment로 변경"을 읽습니다. 내 사과. –

답변

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

과 :

import com.commonsware.cwac.camera.CameraFragment; 

는 호환되지 않습니다. Android Support 패키지의 조각 백 포트를 사용할지 또는 기본 API 레벨 11+ 조각을 사용할지 결정해야합니다. 그리고 선택을 지원하기 위해 전체 활동을 수정해야합니다 (예 : 백 포트를 사용하는 경우 FragmentActivity에서 상속).

백 포트를 사용하려면 camera-v9 라이브러리를 사용하고 com.commonsware.cwac.camera.acl.CameraFragment을 가져와야합니다.하지만 ActionBarSherlock도 사용합니다. ActionBarSherlock이 아닌 백도트의 백 포트가 필요하면 내 CameraFragment 구현 중 하나를 포크하여 해당 조합을 지원해야합니다.

+0

매우 도움이됩니다. 고맙습니다. –

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. :

그러나, 나는 우리가에서 연장이 조각에 대한 일도를 확인할 수 있습니다.

  • 대부분 오픈 소스입니다.
  • 그들은 대개 부모가 원본인지 또는 V4 지원인지 상관하지 않습니다. 그들은 독자적으로 작동합니다. 대신 그들로부터 확장하는
  • 솔루션

    그래서, 우리는 (a)는 상위 클래스를 변경, 또는 (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 조각을 사용하는 이유는 최소 대상이 Android 4.0 이상입니다. 언젠가는 팀원이 일부 초기 버전 (예 : 4.0)에서 기본 제공 조각에 문제가 있다고 말했습니다. v4 지원 라이브러리를 사용하는 것이 현명합니다. 그래서 앱은 버그 수정 버전의 조각과 FragmentActivity를 사용할 것입니다. 틀 렸으면 고쳐줘. V4 라이브러리 사용에 아무런 해가 없으므로 ...... –