Barcode1D应用开发总结
1. 事件处理
实现的方式:
(1) 事件处理方法直接绑定到标签
<Button android:id="@+id/barcode1d" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="24dp" android:text="barcode 1d" android:onClick="barcode1dClickHandler" />
事件处理方法定义如下:
public voidbarcode1dClickHandler(View Source) { Buttonbn = (Button)findViewById(R.id.barcode1d); switch(Source.getId()) { case R.id.barcode1d: bn.setText("clicked"); break; } Log.v(ACTIVITY_TAG,"barcode1dClickHandler()"+Source.getId()); }
如果没有定义形参View source,运行的时候直接弹出类似图1的错误信息,
当view(这里为Button)被点击时,把被点击对象通过source传递进来,可通过source.getId()来获取view的id,在同一个事件处理方法监测多个button的事件时用到。
(2) 匿名类作为事件监听器类
在实现过程中涉及到成员变量定义和初始化的编译问题,顺便一起贴出来
1) 定义时直接初始化
private Button bn = (Button)findViewById(R.id.barcode1d);
2) 在初始化块初始化
private Button bn; { bn =(Button)findViewById(R.id.barcode1d); }
3) 在构造器或是成员方法中初始化
4) 不能再类实现体中且是初始化块或是构造器外或是成员方法外初始化
private Button bn; bn = (Button)findViewById(R.id.barcode1d);
这样的写法在C++中是没问题的,但对于Java来说是错误的。
bn= (Button)findViewById(R.id.barcode1d); bn.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { switch(source.getId()) { case R.id.barcode1d: bn.setText("clicked"); break; } } });
(3) Activity本身作为事件监听器
public classAppCenterActivity extends ActionBarActivity implements OnClickListener{ protected static final String ACTIVITY_TAG="AppCenterActivity"; private Button bn; @Override protected void onCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.app_center); bn =(Button)findViewById(R.id.barcode1d); bn.setOnClickListener((OnClickListener)this); } @Override public void onClick(View source) { bn.setText("clicked"); Log.v(ACTIVITY_TAG,"barcode1dClickHandler()"); } }
这里要注意的是,我们是在AppCenterActivity对象作为监听器,需要让AppCenterActivity实现OnClickListener事件监听接口,这样就可以在AppCenterActivity中直接重载事件处理方法onClick(),当为某个组件添加该事件监听器对象时,直接使用this作为事件监听器对象即可。
2. 一个Activity启动另一个Activity
@Override protected void onCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.app_center); bn =(Button)findViewById(R.id.barcode1d); bn.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { Intentintent = newIntent(AppCenterActivity.this, Barcode1D.class); startActivity(intent); } }); }
这里重点来看语句
Intent intent = new Intent(AppCenterActivity.this, Barcode1D.class);
第1个参数表示AppCenterActivity类的对象,第2个是泛型参数,这里为显式intent,想要启动的是类Barcode1D。
3. 加载so文件的问题
在java.文件中增加下面代码
static {
System.loadLibrary("DeviceAPI");
}
且把libDeviceAPI.so放在libs文件夹下,但运行的时候出错
图1
必须要把libDeviceAPI.so放在libs\armeabi目录下,但我新建的Android应用工程序工程编译后都没有看到armeabi目录,有两种办法:
(1) 手动创建armabi目录,并把libDeviceAPI.so拷贝到此目录下,这适合于libDeviceAPI.so由第三方或是在另一个工程提供的情况。
(2) 自动生成,这适合于libDeviceAPI.so由本工程提供的情况
图2
选择Add Native Support,如下图:
图3
选择finish后会生成jni文件夹,如下图:
图4
编译后会在libs目录下生成armeabi目录,并生成libDeviceAPI.so文件,如上图,编译过程生成libDeviceAPI.so的信息如下:
**** Build of configuration Default for project test **** D:\ADT-bundle\android-ndk-r10b\ndk-build.cmd all Android NDK: WARNING: APP_PLATFORM android-19 is largerthan android:minSdkVersion 8 in ./AndroidManifest.xml [armeabi] Compile++ thumb: DeviceAPI <= DeviceAPI.cpp [armeabi] StaticLibrary : libstdc++.a [armeabi] SharedLibrary : libDeviceAPI.so [armeabi] Install : libDeviceAPI.so => libs/armeabi/libDeviceAPI.so **** Build Finished ****
4. 实现扫描条码并显示功能
package com.example.appcenter; import com.rscja.deviceapi.Barcode1D; import com.rscja.deviceapi.exception.ConfigurationException; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public classBarcode1DActivity extends ActionBarActivity{ private static final String TAG = Barcode1D.class.getSimpleName(); private Button startButton; private Button clearButton; private Button closeButton; private Barcode1D mInstance; private TextView bcTextView; private String barCode = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.barcode1d); try { mInstance = Barcode1D.getInstance(); }catch(ConfigurationException e) { return; } mInstance.open(); startButton =(Button)findViewById(R.id.barcode1d_scan); clearButton =(Button)findViewById(R.id.barcode1d_clear); closeButton =(Button)findViewById(R.id.barcode1d_close); bcTextView =(TextView)findViewById(R.id.barcode_content); startButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { scan(); } }); clearButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { bcTextView.setText(""); } }); closeButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { mInstance.close(); finish(); } }); //Log.v(TAG,"onCreate()"); } private void scan() { barCode = mInstance.scan(); Log.i(TAG, "barCode "+ barCode.trim()); bcTextView.setText(barCode); } }
下面来看布局就可知道此程序实现的功能了:
图5