我正在尝试实现一个显示相机预览并包含两个按钮的活动。获取相机预览是没有问题的,但当我尝试使用findViewById按钮对象时,应用程序将崩溃。不确定为什么会这样。
package com.capstone.parking.nyc;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceView;
import android.view.SurfaceHolder;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.graphics.PixelFormat ;
import android.hardware.Camera;
import android.hardware.Sensor;
import android.hardware.SensorManager;
public class MainScreen extends Activity implements SurfaceHolder.Callback
{
Camera theCamera;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
boolean preview = false;
private SensorManager mSensorManager;
private ShakeListener mSensorListener;
@Override
public void onCreate(Bundle savedInstanceState)
{
final Button TagBttn;
final Button ParkBttn;
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFormat(PixelFormat.UNKNOWN);
setContentView(R.layout.mainscreen);
/*
*
* This line causes the crash
*/
TagBttn = (Button) findViewById(R.id.tag);
// ParkBttn = (Button)findViewById(R.id.park);
surfaceView = (SurfaceView) findViewById(R.id.camera);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mSensorListener = new ShakeListener();
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensorManager.registerListener(mSensorListener,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
Log.d("TAG", "onCreate MainScreen");
mSensorListener.setOnShakeListener(new ShakeListener.OnShakeListener()
{
public void onShake()
{
Log.d("SHAKE CHECK", "YUSSSSSS");
// if shaken, go to the search screen
startActivity(new Intent("com.capstone.parking.SEARCH"));
}
});
/* Tag.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
/*
*
* ENTER TAG CODE HERE
*
*
Log.d("TAG", "tag button pressed");
}
});
/*
/* Park.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
/*
*
* ENTER PARK CODE HERE
*
*
Log.e("TAG", "park button pressed");
}
});
*/
}
@Override
public void onResume()
{
super.onResume();
mSensorManager.registerListener(mSensorListener,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
}
@Override
public void onStop()
{
mSensorManager.unregisterListener(mSensorListener);
super.onStop();
}
public void surfaceCreated(SurfaceHolder holder)
{
Log.e("TAG", "surfaceCreated");
theCamera = Camera.open();
try
{
theCamera.setPreviewDisplay(holder);
}
catch (IOException e)
{
Log.e("TAG", "surfaceCreated FAIL");
}
theCamera.startPreview();
preview = true;
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
Log.e("TAG", "surfaceChanged");
if(preview)
{
theCamera.stopPreview();
}
Camera.Parameters parameters = theCamera.getParameters();
parameters.setPreviewSize(width, height);
// parameters.set("orientation", "portrait");
// parameters.set("rotation", "90");
theCamera.setParameters(parameters);
theCamera.startPreview();
}
public void surfaceDestroyed(SurfaceHolder holder)
{
if(preview)
{
Log.e("TAG", "surfaceDestroyed");
theCamera.stopPreview();
theCamera.release();
theCamera = null;
preview = false;
}
}
}
如果有人能指导我朝着正确的方向前进,我将非常感激。谢谢!
mainscreen.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/background"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#006699" >
<TextView
android:id="@+id/scroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:text="@string/shake"
android:textColor="#ffff66"
android:textStyle="bold" />
<SurfaceView
android:id="@+id/camera"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:layout_marginBottom="125dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp" >
</SurfaceView>
<ImageButton
android:id="@+id/tag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginRight="25dp"
android:layout_marginBottom="50dp"
android:contentDescription="@string/desc"
android:background="@drawable/tagbuttonselect"
android:clickable="true" />
<ImageButton
android:id="@+id/park"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_marginLeft="25dp"
android:layout_marginBottom="50dp"
android:contentDescription="@string/desc"
android:background="@drawable/parkbuttonselect"
android:clickable="true" />
</RelativeLayout>
编辑**
哇,哇。我是慢热型。我刚想通了。我使用的是Button而不是ImageButton。 SMH对不起,伙计们。洛尔答案 0 :(得分:5)
尝试将TagBttn = (Button) findViewById(R.id.tag);
更改为TagBttn = (ImageButton) findViewById(R.id.tag);
答案 1 :(得分:2)
可能是您尝试查找ID不在 mainscreen.xml
中这里的标签是一个ImageButton no simole Button 试试这个
TagBttn = (ImageButton) findViewById(R.id.tag);
答案 2 :(得分:1)
您的标记项是ImageButton,您将其转换为Button。更改。 ImageButton和Button是非常不同的类。
答案 3 :(得分:1)
无论听起来有多混乱,事实证明ImageButton
不是Button
的子类。所以你想用以下代码替换你的代码:
final ImageButton TagBttn;
final ImageButton ParkBttn;
然后使用:
TagBttn = (ImageButton) findViewById(R.id.tag);
ParkBttn = (ImageButton) findViewById(R.id.park);