Android Framelayout显示单个ImageButton

Android Framelayout显示单个ImageButton,android,android-framelayout,Android,Android Framelayout,以下是我的相机片段框架布局: <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color

以下是我的相机片段框架布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/sc_background">

    <FrameLayout
        android:id="@+id/sc_camera_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center_horizontal"
        android:layout_marginBottom="16dp"
        >

        <ImageButton
            android:id="@+id/sc_btn_flip_camera"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/sc_ic_camera_switch"
            style="?attr/scButtonSwitchCameraStyle"
            />

        <ImageButton
            android:id="@+id/sc_btn_take_picture"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/sc_ic_camera"
            style="?attr/scButtonTakePictureStyle"
            />

        <ImageButton
            android:id="@+id/sc_btn_record_video"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/sc_ic_video"
            style="?attr/scButtonRecordVideoStyle"
            />

        <ImageButton
            android:id="@+id/sc_btn_stop_recording_video"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/sc_ic_stop"
            style="?attr/scButtonStopRecordingStyle"
            />

    </LinearLayout>

</FrameLayout>

但当我在手机上运行该程序时,它只显示sc_btn_take_picture

    private static final String TAG = SimpleCameraFragment.class.getSimpleName();

    public static final int MENU_ITEM_QUALITY = 18438;


    interface Contract {

        void onPictureTaken(File photo);

        void onVideoRecorded(File video);

        void startSwitchingCamera(boolean currentlyFront);

        void changeCameraContainerSize(int width, int height);
    }

    public static SimpleCameraFragment newInstance(
            boolean startWithFrontFacingCamera,
            boolean camIsSwitchable,
            File directory,
            String location,
            Size pictureSize) {

        SimpleCameraFragment fragment = new SimpleCameraFragment();

        Bundle args = new Bundle(5);
        args.putBoolean(KEY_USE_FFC, startWithFrontFacingCamera);
        args.putBoolean(KEY_CAM_SWITCHABLE, camIsSwitchable);
        args.putString(KEY_FILE_DIR, directory == null ? null : directory.getPath());
        args.putString(KEY_FILE_NAME, location != null ? location : UUID.randomUUID().toString());
        args.putInt(KEY_PICTURE_SIZE, pictureSize.ordinal());

        fragment.setArguments(args);
        return fragment;
    }

    public enum Size {
        AVATAR(640 * 480),
        NORMAL(1280 * 960);

        private final int product;

        Size(int product) {
            this.product = product;
        }

        static Size tryOrdinal(int ordinal) {
            for (Size size : values()) {
                if (size.ordinal() == ordinal) {
                    return size;
                }
            }
            return NORMAL;
        }
    }

    public static final String KEY_USE_FFC = "com.askcs.teamup.ui.fragment.CameraFragment.USE_FFC";
    public static final String KEY_CAM_SWITCHABLE = "com.askcs.teamup.ui.fragment.CameraFragment.CAM_IS_SWITCHABLE";
    public static final String KEY_FILE_DIR = "com.askcs.teamup.ui.fragment.CameraFragment.FILE_DIR";
    public static final String KEY_FILE_NAME = "com.askcs.teamup.ui.fragment.CameraFragment.EXTRA_FILENAME";
    public static final String KEY_PICTURE_SIZE = "com.askcs.teamup.ui.fragment.CameraFragment.PICTURE_SIZE";

    private Contract contractor;
    private String flashMode = null;

    private boolean useFrontFacingCamera;
    private boolean canSwitchCamera;
    private boolean autoFocusAvailable;
    private File finalFile;
    private File dir;
    private String fileName;

    private int jpegQuality = 85;
    private Size imageSize = Size.NORMAL;

    private ImageButton btnTakePicture;
    private ImageButton btnSwitchCamera;
    private ImageButton btnRecordVideo;
    private ImageButton btnStopRecordingVideo;

    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);

        setHasOptionsMenu(true);

        String dirString = getArguments().getString(KEY_FILE_DIR);
        fileName = getArguments().getString(KEY_FILE_NAME);
        imageSize = Size.tryOrdinal(getArguments().getInt(KEY_PICTURE_SIZE, 0));
        useFrontFacingCamera = getArguments().getBoolean(KEY_USE_FFC);
        canSwitchCamera = getArguments().getBoolean(KEY_CAM_SWITCHABLE);

        dir = TextUtils.isEmpty(dirString) ? getActivity().getCacheDir() : new File(dirString);

        SimpleCameraHost.Builder builder =
                new SimpleCameraHost.Builder(new CameraHost(getActivity()));

        builder.useFullBleedPreview(false);

        setCameraHost(builder.build());
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = super.onCreateView(inflater, container, savedInstanceState);

        FrameLayout root = (FrameLayout) inflater.inflate(R.layout.sc_camera_fragment, null);

        ((FrameLayout) root.findViewById(R.id.sc_camera_container)).addView(view);

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (autoFocusAvailable) {
                    autoFocus();
                }
            }
        });

        btnTakePicture = (ImageButton) root.findViewById(R.id.sc_btn_take_picture);
        btnTakePicture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onTakePictureClick();
            }
        });

        btnSwitchCamera = (ImageButton) root.findViewById(R.id.sc_btn_flip_camera);
        btnSwitchCamera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onSwitchCameraClick();
            }
        });

        btnRecordVideo = (ImageButton) root.findViewById(R.id.sc_btn_record_video);
        btnRecordVideo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onRecordVideoClick();
            }
        });

        btnStopRecordingVideo = (ImageButton) root.findViewById(R.id.sc_btn_stop_recording_video);
        btnStopRecordingVideo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onStopRecordVideoClick();
            }
        });

        return root;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        resetButtons();
    }

    void onTakePictureClick() {

        btnTakePicture.setEnabled(false);
        btnSwitchCamera.setEnabled(false);
        btnRecordVideo.setEnabled(false);

        takePicture();
    }

    void onSwitchCameraClick() {

        // Disable functions to prevent issues during fragment replacement
        btnTakePicture.setEnabled(false);
        btnSwitchCamera.setEnabled(false);
        btnRecordVideo.setEnabled(false);
        btnStopRecordingVideo.setEnabled(false);

        // Tell the parent activity to replace this fragment by the one with the 'different' camera view
        // If current is front, change to back. If current is back, change to front.
        ((SimpleCameraActivity) getActivity()).startSwitchingCamera( useFrontFacingCamera );

    }

    void onRecordVideoClick() {

        btnTakePicture.setEnabled(false);
        btnTakePicture.setVisibility(GONE);

        btnSwitchCamera.setEnabled(false);
        btnSwitchCamera.setVisibility(GONE);

        btnRecordVideo.setEnabled(false);
        btnRecordVideo.setVisibility(GONE);

        btnStopRecordingVideo.setEnabled(true);
        btnStopRecordingVideo.setVisibility(VISIBLE);

        try {
            record();
        }
        catch (Exception e) {
            Log.e(TAG, "Something went wrong while calling record()", e);
        }
    }

    void onStopRecordVideoClick() {

        btnStopRecordingVideo.setEnabled(false);

        try {
            stopRecording();
        }
        catch (IOException e) {
            Log.e(TAG, "Something went wrong while calling stopRecording()", e);
        }
    }

    void resetButtons() {

        if (btnTakePicture != null) {
            btnTakePicture.setVisibility(VISIBLE);
            btnTakePicture.setEnabled(true);
        }

        if (btnRecordVideo != null) {
            btnRecordVideo.setVisibility(GONE);
            btnRecordVideo.setEnabled(false);
        }

        // Check if we have to show the switch camera button
        if (btnSwitchCamera != null) {

            if(canSwitchCamera) {
                btnSwitchCamera.setVisibility(VISIBLE);
                btnSwitchCamera.setEnabled(true);
            } else {
                btnSwitchCamera.setVisibility(GONE);
                btnSwitchCamera.setEnabled(false);
            }

        }

        if (btnStopRecordingVideo != null) {
            btnStopRecordingVideo.setVisibility(GONE);
            btnStopRecordingVideo.setEnabled(false);
        }
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        this.contractor = (Contract) activity;
    }

    @Override
    public void onDetach() {
        super.onDetach();

        this.contractor = null;
    }

    @Override
    public void takePicture() {
        if (!btnTakePicture.isEnabled()) {

            btnTakePicture.setVisibility(View.GONE);
            btnTakePicture.setEnabled(false);

            super.takePicture(new PictureTransaction(getCameraHost()).flashMode(flashMode).mirrorFFC(true));
        }
    }

    @Override
    public void stopRecording() throws IOException {
        super.stopRecording();

        contractor.onVideoRecorded(finalFile);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);

        MenuItem qualitySlider = menu.add(0, MENU_ITEM_QUALITY, 0, R.string.sc_menu_label_quality);
        MenuItemCompat.setShowAsAction(qualitySlider, MenuItem.SHOW_AS_ACTION_NEVER);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {

            case MENU_ITEM_QUALITY:

                new DialogFragment() {

                    private int newJpegQuality;

                    @Override
                    public Dialog onCreateDialog(Bundle savedInstanceState) {

                        LinearLayout rootView = (LinearLayout) View.inflate(getActivity(), R.layout.sc_dialog_quality, null);

                        SeekBar qualityBar = (SeekBar) rootView.getChildAt(0);
                        qualityBar.setMax(50);
                        qualityBar.setProgress(jpegQuality - 50);
                        qualityBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                            @Override
                            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                                if (fromUser) {
                                    newJpegQuality = 50 + progress;
                                    getDialog().setTitle(getString(R.string.sc_image_quality, new Object[]{newJpegQuality}));
                                }
                            }

                            @Override
                            public void onStartTrackingTouch(SeekBar seekBar) {
                                // ignored
                            }

                            @Override
                            public void onStopTrackingTouch(SeekBar seekBar) {
                                // ignored
                            }
                        });

                        return new AlertDialog.Builder(getActivity())
                                .setTitle("Image quality: " + jpegQuality + "%")
                                .setView(rootView)
                                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        jpegQuality = newJpegQuality;
                                        dialog.dismiss();
                                    }
                                })
                                .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        dialog.dismiss();
                                    }
                                })
                                .create();
                    }
                }.show(getFragmentManager(), "quality-slider");

                return true;
        }

        return (super.onOptionsItemSelected(item));
    }

    class CameraHost extends SimpleCameraHost {

        public CameraHost(Context _ctxt) {
            super(_ctxt);
        }

        @Override
        public Camera.Parameters adjustPictureParameters(PictureTransaction xact, Camera.Parameters parameters) {

            parameters.setJpegQuality(jpegQuality);

            for (Camera.Size size : parameters.getSupportedPictureSizes()) {
                Log.v(TAG, "w=" + size.width + ", h=" + size.height);
            }

            return parameters;
        }

        @Override
        public Camera.Size getPictureSize(PictureTransaction xact, Camera.Parameters parameters) {

            List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
            ArrayList<Integer> calculated = new ArrayList<Integer>();

            for (Camera.Size size : sizes) {
                calculated.add(size.height * size.width);
            }

            int closestIndexUntilNow = 0;
            int lastDelta = Integer.MAX_VALUE;
            for (int i = 0; i < calculated.size(); i++) {

                int delta = Math.abs(imageSize.product - calculated.get(i));

                if (delta < lastDelta) {
                    closestIndexUntilNow = i;
                }

                lastDelta = delta;
            }

            Camera.Size size = sizes.get(closestIndexUntilNow);

            Log.v(TAG, "Chosen size: w=" + size.width + ", h=" + size.height);

            return size;
        }

        @Override
        public float maxPictureCleanupHeapUsage() {
            return super.maxPictureCleanupHeapUsage();
        }

        @Override
        protected File getPhotoPath() {

            if (finalFile == null) {
                finalFile = super.getPhotoPath();
            }

            return finalFile;
        }

        @Override
        public RecordingHint getRecordingHint() {
            return RecordingHint.STILL_ONLY;
        }

        @Override
        protected File getVideoPath() {

            if (finalFile == null) {
                finalFile = super.getVideoPath();
            }

            return finalFile;
        }

        @Override
        protected File getPhotoDirectory() {
            return dir;
        }

        @Override
        protected String getPhotoFilename() {

            if (!fileName.endsWith(".jpg")) {
                fileName += ".jpg";
            }

            Log.v(TAG, String.valueOf(fileName));

            return fileName;
        }

        @Override
        protected File getVideoDirectory() {
            return dir;
        }

        @Override
        protected String getVideoFilename() {

            if (!fileName.endsWith(".mp4")) {
                fileName += ".mp4";
            }

            Log.v(TAG, String.valueOf(fileName));

            return fileName;
        }

        @Override
        public boolean useFrontFacingCamera() {
            return useFrontFacingCamera;
        }

        @Override
        public boolean useSingleShotMode() {
            return true;
        }

        @Override
        public void saveImage(PictureTransaction xact, byte[] image) {

            File photo = getPhotoPath();

            if (photo.exists()) {
                photo.delete();
            }

            try {
                FileOutputStream fos = new FileOutputStream(photo.getPath());
                BufferedOutputStream bos = new BufferedOutputStream(fos);

                bos.write(image);
                bos.flush();
                fos.getFD().sync();
                bos.close();
            }
            catch (IOException e) {
                handleException(e);
            }

            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    btnTakePicture.setEnabled(false);
                    btnRecordVideo.setEnabled(false);
                    btnStopRecordingVideo.setEnabled(false);

                    btnTakePicture.setVisibility(GONE);
                    btnRecordVideo.setVisibility(GONE);
                    btnStopRecordingVideo.setVisibility(GONE);

                    resetButtons();

                    contractor.onPictureTaken(new File(dir, fileName));
                }
            });
        }

        @Override
        public void autoFocusAvailable() {
            autoFocusAvailable = true;
        }

        @Override
        public void autoFocusUnavailable() {
            autoFocusAvailable = false;
        }

        @Override
        public void onCameraFail(com.google.cam2.camera.CameraHost.FailureReason reason) {
            super.onCameraFail(reason);

            Toast.makeText(getActivity(),
                    "Sorry, but you cannot use the camera now!",
                    Toast.LENGTH_LONG).show();
        }

        @Override
        public Camera.Parameters adjustPreviewParameters(Camera.Parameters parameters) {
            flashMode =
                    CameraUtils.findBestFlashModeMatch(parameters,
                            Camera.Parameters.FLASH_MODE_RED_EYE,
                            Camera.Parameters.FLASH_MODE_AUTO,
                            Camera.Parameters.FLASH_MODE_ON);

            List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
            ArrayList<Integer> calculated = new ArrayList<Integer>();

            for (Camera.Size size : sizes) {
                calculated.add(size.height * size.width);
            }

            int closestIndexUntilNow = 0;
            int lastDelta = Integer.MAX_VALUE;
            for (int i = 0; i < calculated.size(); i++) {

                int delta = Math.abs(imageSize.product - calculated.get(i));

                if (delta < lastDelta) {
                    closestIndexUntilNow = i;
                }

                lastDelta = delta;
            }

            Camera.Size size = sizes.get(closestIndexUntilNow);

            parameters.setPreviewSize(size.width, size.height);

            return (super.adjustPreviewParameters(parameters));
        }

        @Override
        public Camera.Size getPreviewSize(int displayOrientation, int width, int height, Camera.Parameters parameters) {

            List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
            ArrayList<Integer> calculated = new ArrayList<Integer>();

            for (Camera.Size size : sizes) {
                calculated.add(size.width * size.height);
            }

            int closestIndexUntilNow = 0;
            int lastDelta = Integer.MAX_VALUE;
            for (int i = 0; i < calculated.size(); i++) {

                int delta = Math.abs(imageSize.product - calculated.get(i));

                if (delta < lastDelta) {
                    closestIndexUntilNow = i;
                }

                lastDelta = delta;
            }

            Camera.Size size = sizes.get(closestIndexUntilNow);
//            contractor.changeCameraContainerSize(size.width, size.height);

            return size;
        }

        @Override
        public boolean mirrorFFC() {
            return true;
        }
    }
}
private static final String TAG=SimpleCameraFragment.class.getSimpleName();
公共静态最终整数菜单项质量=18438;
接口合同{
void onPictureTaken(文件照片);
视频记录无效(文件视频);
无效启动切换摄像头(布尔currentlyFront);
void changeCameraContainerSize(整数宽度、整数高度);
}
公共静态SimpleCameraFragment newInstance(
boolean StartWithFrontFacing摄像头,
布尔凸轮可切换,
文件目录,
字符串位置,
大小(图片大小){
SimpleCameraFragment片段=新的SimpleCameraFragment();
Bundle args=新Bundle(5);
参数putBoolean(键使用FFC,开始前向摄像头);
参数putBoolean(键可切换,凸轮可切换);
args.putString(KEY_FILE_DIR,directory==null?null:directory.getPath());
args.putString(KEY\u FILE\u NAME,location!=null?位置:UUID.randomuid().toString());
args.putInt(KEY_PICTURE_SIZE,pictureSize.ordinal());
fragment.setArguments(args);
返回片段;
}
公共枚举大小{
阿凡达(640*480),
正常(1280*960);
私人最终产品;
大小(整数产品){
本产品=产品;
}
静态大小tryOrdinal(整数顺序){
对于(大小:值()){
if(size.ordinal()==ordinal){
返回大小;
}
}
恢复正常;
}
}
公共静态最终字符串键\u USE\u FFC=“com.askcs.teamup.ui.fragment.CameraFragment.USE\u FFC”;
公共静态最终字符串键\u CAM\u SWITCHABLE=“com.askcs.teamup.ui.fragment.CameraFragment.CAM\u可切换”;
public static final String KEY_FILE_DIR=“com.askcs.teamup.ui.fragment.CameraFragment.FILE_DIR”;
public static final String KEY_FILE_NAME=“com.askcs.teamup.ui.fragment.CameraFragment.EXTRA_FILENAME”;
公共静态最终字符串键\u PICTURE\u SIZE=“com.askcs.teamup.ui.fragment.CameraFragment.PICTURE\u SIZE”;
私人合约承办商;
私有字符串flashMode=null;
专用前置摄像头;
私人摄像机;
私有布尔自聚焦可用;
私有文件最终文件;
私有文件目录;
私有字符串文件名;
私人品质=85;
私有大小imageSize=Size.NORMAL;
私人图像按钮btntakpicture;
私人图像按钮BTN开关摄像机;
私人图像按钮BTN录制视频;
私人图像按钮BTNStoRecordingVideo;
@凌驾
创建时的公共void(捆绑状态){
super.onCreate(state);
设置选项菜单(真);
String dirString=getArguments().getString(KEY\u FILE\u DIR);
fileName=getArguments().getString(键文件名);
imageSize=Size.tryOrdinal(getArguments().getInt(KEY\u PICTURE\u Size,0));
useFrontFacingCamera=getArguments().getBoolean(键\u USE\u FFC);
canSwitchCamera=getArguments().getBoolean(键可切换);
dir=TextUtils.isEmpty(dirString)?getActivity().getCacheDir():新文件(dirString);
SimpleCameraHost.Builder=
新的SimpleCameraHost.Builder(新的CameraHost(getActivity());
builder.UsefulbleedPreview(false);
setCameraHost(builder.build());
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=super.onCreateView(充气机、容器、保存状态);
FrameLayout根=(FrameLayout)充气器。充气(R.layout.sc\u摄影机\u片段,null);
((FrameLayout)root.findviewbyd(R.id.sc\u camera\u container)).addView(view);
view.setOnClickListener(新的view.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(自动聚焦可用){
自动对焦();
}
}
});
btnTakePicture=(ImageButton)root.findViewById(R.id.sc\u btn\u take\u picture);
btnTakePicture.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
onTakePictureClick();
}
});
btnSwitchCamera=(ImageButton)root.findViewById(R.id.sc\u btn\u flip\u camera);
btnSwitchCamera.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
onSwitchCameraClick();
}
});
btnRecordVideo=(ImageButton)root.findViewById(R.id.sc\u btn\u record\u video);
btnRecordVideo.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
onRecordVideoClick();
}
});
btnStopRecordingVideo=(ImageButton)root.findViewById(R.id.sc\u btn\u stop\u recording\u video);
btnStopRecordingVideo.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
onStopRecordVideoClick();
}
});
返回根;
}
@凌驾
已创建视图上的公共void(视图,捆绑保存状态){
super.onViewCreated(视图,savedInstanceState);
重置按钮();
}
void onTakePictureClick(){
btnTakePicture.setEnabled(false);
btnSwitchCamera.setEnabled(假);
btnRecordVideo.setEnabled(假);
拍摄照片();
}
void onSwitchCameraClick(){
//禁用功能以防止片段替换期间出现问题
btnTakePicture.setEnabled(false);
btnSwitchCamera.setEna