Commonsware CWAC切换片段

时间:2014-09-23 13:09:18

标签: android android-fragments android-camera commonsware-cwac

我正在尝试实施Commonsware CWAC-Camera,我遇到了将其纳入现有片段的问题。

我遇到一个问题,我不能使用.add或.replace,它希望我将CameraFragment更改为Fragment。

ERROR:

  

FragmentTransaction类型中的方法add(int,Fragment,String)不适用于参数(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();
    }
}

2 个答案:

答案 0 :(得分:1)

import android.support.v4.app.Fragment;

import com.commonsware.cwac.camera.CameraFragment;

不兼容。您需要决定是否要使用Android支持包中的片段backport,或者是否要使用本机API Level 11+片段。您需要修改整个活动以支持您的选择(例如,如果您使用的是后端,则从FragmentActivity继承)。

如果要使用backport,则需要使用camera-v9库并导入com.commonsware.cwac.camera.acl.CameraFragment,但这也使用ActionBarSherlock。如果你想要片段的后端而不是ActionBarSherlock,你需要分叉我的一个CameraFragment实现来支持这种组合。

答案 1 :(得分:0)

<强>问题

我想告诉你解决CameraFragment不兼容问题的方法。我的应用程序使用V4支持库(不知何故我不知道为什么)但没有ActionBarSherlock。因为我的目标平台是V11及以上(是的,不支持2.3及以下)。

  • com.commonsware.cwac.camera.CameraFragment - &gt;与V4支持库不兼容,因此与我们的V4 FragmentActivity和其他片段不兼容。

  • com.commonsware.cwac.camera.acl.CameraFragment - &gt;不起作用,因为我没有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支持 - 他们自己工作。
  4. <强>解决方案

    因此,我们可以(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)我可以避免需要ActionBarSherlock的camera-v9,并且我从v4片段扩展了所有片段。
    5. 享受〜