我正在尝试实施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();
}
}
答案 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
<强>问题强>
但是,我注意到有关这些片段的一些内容:
<强>解决方案强>
因此,我们可以(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。唯一的工作就是用我的克隆来区分他们的版本。
<强>优势强>
camera-v9
,并且我从v4片段扩展了所有片段。享受〜