用的是智聯天地N5的掃描槍
原來的DEMO是這樣的
package com.juri.juriscanner;
import java.util.ArrayList;
import com.zltd.decoder.Constants; //呼叫sdk
import com.zltd.industry.ScannerManager; //這個也是sdk的
import com.juri.juriscanner.R;
//import android.annotation.SuppressLint;SoundUtils //這個是聲音介面
import android.app.Activity; //下面的是系統自帶的
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.os.Handler; //訊息處理 Handler對像
import android.os.Message;
import android.widget.ArrayAdapter;
import androidx.annotation.NonNull;
public abstract class BaseActivity extends Activity implements //調肜了iscannerstatuslisterner介面
ScannerManager.IScannerStatusListener {
protected static final int UPDATE_LIST = 4096; //4096
protected static final int UPDATE_NUMBER = 4097; //4097
protected ScannerManager mScannerManager;
protected SoundUtils mSoundUtils;
protected ArrayList<String> mBarcodeList = new ArrayList<String>(); //條碼串列串列
protected ArrayAdapter<String> mListAdaper; //字串配接器
protected int pressed = 0; //計數器,用來計算按鍵數
protected int scanned = 0; //計數器,用來計算掃描數
protected int decoderType = 0;
//onCreate方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mScannerManager = ScannerManager.getInstance(); //實體化
decoderType = mScannerManager.getDecoderType(); //解碼型別
mSoundUtils = SoundUtils.getInstance();//聲音物件
mSoundUtils.init(this); //聲音初始化
mListAdaper = new ArrayAdapter<String>(this, R.layout.list_item, mBarcodeList);
}
public void onResume() {
super.onResume();
//2.回傳后繼續代碼
int res = mScannerManager.connectDecoderSRV(); //連接驅動
mScannerManager.addScannerStatusListener(this);
if (decoderType == Constants.DECODER_ONED_SCAN) { //解碼型別
if (!mScannerManager.getScannerEnable()) {
new AlertDialog.Builder(this)
.setTitle(R.string.action_settings)
.setIcon(android.R.drawable.ic_dialog_info)
.setMessage(R.string.scan_message)
.setPositiveButton(R.string.dialog_ok, new OnClickListener() {
@Override
public void onClick(DialogInterface paramDialogInterface, int paramInt) {
closeSelf();
}
})
.setCancelable(false)
.show();
}
}
}
// 4.APP暫停代碼
public void onPause() {
mScannerManager.removeScannerStatusListener(this);
mScannerManager.disconnectDecoderSRV(); //斷開連接
super.onPause();
}
protected void closeSelf() {
this.finish();
}
//更新UI,這里HANDLDER是因為安卓子執行緒不能更新UI,必須通過HANLDER方向
//HANDLER接收訊息
//@SuppressLint("HandlerLeak")
// protected Handler mHandle = new Handler() {
//// public void handleMessage(Message msg) {
//// switch (msg.what) {
//// case UPDATE_LIST:
//// scanned++; //次數增加
//// mSoundUtils.success(); //播放聲音
//// updateList((String) msg.obj); //添加資料到串列框
//// case UPDATE_NUMBER: //增加數量,顯示在前臺標簽
//// updateCount();
//// break;
//// default:
//// break;
//// }
//// }
//// };
protected Handler mHandle=new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
switch (msg.what){
case 4096:
scanned++; //次數增加
mSoundUtils.success();
updateList((String) msg.obj); //添加資料到串列框
case 4097:
//updateCount();
break;
default:
break;
}
return false;
}
});
public abstract void updateCount();
public abstract void updateList(String data);
//清除訊息
public void clear() {
mBarcodeList.clear(); //清除串列
mListAdaper.notifyDataSetChanged(); //配接器清空
pressed = 0;
scanned = 0;
mHandle.sendEmptyMessage(4097); //發送資料
}
//3.結果改變,sdk事件
@Override
public void onScannerResultChanage(byte[] arg0) {
String data = new String(arg0);
Message msg = mHandle.obtainMessage(4096, data); //獲取訊息
mHandle.sendMessage(msg);
}
//掃描狀態改變
@Override
public void onScannerStatusChanage(int arg0) {
// TODO Auto-generated method stub
}
}
package com.juri.juriscanner;
import com.zltd.industry.ScannerManager; //呼叫sdk介面
import com.juri.juriscanner.R;
import android.content.Intent; //intent方法
import android.os.Bundle;
import android.view.KeyEvent; //鍵盤事件
import android.view.View;
import android.widget.Button; //下面這些都是控制元件
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
public class MainActivity extends BaseActivity {
private boolean mIsScanKeyDown = false; //初始化控制元件變數
private ListView mListView;
private TextView mTextView;
private CheckBox mToneCheckBox;
private RadioGroup mRadioGroup;
private RadioButton mSingleButton;
private RadioButton mContinuousButton;
private RadioButton mKeyHoldButton;
private Button mAutoTestButton;
private Button mSingleScanButton;
private Button mContinousScanButton;
protected boolean inContinuousShoot = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.textView);
mListView = (ListView) findViewById(R.id.list);
mAutoTestButton = (Button) findViewById(R.id.button_auto_test);
mToneCheckBox = (CheckBox) findViewById(R.id.checkBox_tone);
mToneCheckBox.setChecked(mSoundUtils.getPlay());
//通過這個按扭事件來設定聲音是否可用
mToneCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mSoundUtils.enablePlay(isChecked); //單選框是保證這個是否可用,如果不可用,就不播放聲音了
}
});
mSingleButton = (RadioButton) findViewById(R.id.single_radioButton); //單掃按鍵
mContinuousButton = (RadioButton) findViewById(R.id.continuous_radioButton); //連掃按鍵
mKeyHoldButton = (RadioButton) findViewById(R.id.key_radioButton);
mRadioGroup = (RadioGroup) findViewById(R.id.rg);
//單選框的點擊事件
mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.single_radioButton:
mScannerManager.setScanMode(ScannerManager.SCAN_SINGLE_MODE); //設定為單掃模式
break;
case R.id.continuous_radioButton: //多掃模式
mScannerManager.setScanMode(ScannerManager.SCAN_CONTINUOUS_MODE);
break;
case R.id.key_radioButton: //掛起模式
mScannerManager.setScanMode(ScannerManager.SCAN_KEY_HOLD_MODE);
break;
default:
break;
}
}
});
// mAutoCheckBox = (CheckBox) findViewById(R.id.checkBox_auto);
// mAutoCheckBox.setChecked(mAutoScan);
// mAutoCheckBox.setOnCheckedChangeListener(new
// OnCheckedChangeListener() {
// @Override
// public void onCheckedChanged(CompoundButton buttonView, boolean
// isChecked) {
// mAutoScan = isChecked;
// mHandle.sendEmptyMessage(AUTO_SCAN);
// }
// });
mSingleScanButton = (Button) findViewById(R.id.single_button);
mContinousScanButton = (Button) findViewById(R.id.continuous_button);
mListView.setAdapter(mListAdaper);
}
//恢復狀態,用來恢復
public void onResume() {
super.onResume();
switch (mScannerManager.getScanMode()) { //獲取 這個狀態,如果是連掃模式,那么單掃不可用,自動測驗可用
case ScannerManager.SCAN_CONTINUOUS_MODE:
mSingleScanButton.setEnabled(false);
mContinuousButton.setChecked(true);
mAutoTestButton.setEnabled(false);
break;
case ScannerManager.SCAN_KEY_HOLD_MODE: //如果是自動測驗,那么前面兩個不可用
mContinousScanButton.setEnabled(false);
mSingleScanButton.setEnabled(false);
mKeyHoldButton.setChecked(true);
break;
case ScannerManager.SCAN_SINGLE_MODE: //單掃模式
default:
mContinousScanButton.setEnabled(false);
mSingleButton.setChecked(true);
break;
}
}
/*
* public boolean dispatchKeyEvent(KeyEvent event) { if(event.getKeyCode()
* == KeyEvent.KEYCODE_BUTTON_A) {
* mScannerManager.dispatchScanKeyEvent(event); return true; } return
* super.dispatchKeyEvent(event);
*
* }
*/
//這兩個按扭事件一個意思就是為了防止長按,設定了一個策略,如果長按,那么為false也就是不會執行
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (event.getKeyCode())
{
case KeyEvent.KEYCODE_BUTTON_A: {
if (!mIsScanKeyDown) { //如果非按下狀態,
pressed++;//按下計數器增加
mScanner
uj5u.com熱心網友回復:
package com.juri.juriscanner;
import com.zltd.industry.ScannerManager; //呼叫sdk介面
import com.juri.juriscanner.R;
import android.content.Intent; //intent方法
import android.os.Bundle;
import android.view.KeyEvent; //鍵盤事件
import android.view.View;
import android.widget.Button; //下面這些都是控制元件
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
public class MainActivity extends BaseActivity {
private boolean mIsScanKeyDown = false; //初始化控制元件變數
private ListView mListView;
private TextView mTextView;
private CheckBox mToneCheckBox;
private RadioGroup mRadioGroup;
private RadioButton mSingleButton;
private RadioButton mContinuousButton;
private RadioButton mKeyHoldButton;
private Button mAutoTestButton;
private Button mSingleScanButton;
private Button mContinousScanButton;
protected boolean inContinuousShoot = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.textView);
mListView = (ListView) findViewById(R.id.list);
mAutoTestButton = (Button) findViewById(R.id.button_auto_test);
mToneCheckBox = (CheckBox) findViewById(R.id.checkBox_tone);
mToneCheckBox.setChecked(mSoundUtils.getPlay());
//通過這個按扭事件來設定聲音是否可用
mToneCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mSoundUtils.enablePlay(isChecked); //單選框是保證這個是否可用,如果不可用,就不播放聲音了
}
});
mSingleButton = (RadioButton) findViewById(R.id.single_radioButton); //單掃按鍵
mContinuousButton = (RadioButton) findViewById(R.id.continuous_radioButton); //連掃按鍵
mKeyHoldButton = (RadioButton) findViewById(R.id.key_radioButton);
mRadioGroup = (RadioGroup) findViewById(R.id.rg);
//單選框的點擊事件
mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.single_radioButton:
mScannerManager.setScanMode(ScannerManager.SCAN_SINGLE_MODE); //設定為單掃模式
break;
case R.id.continuous_radioButton: //多掃模式
mScannerManager.setScanMode(ScannerManager.SCAN_CONTINUOUS_MODE);
break;
case R.id.key_radioButton: //掛起模式
mScannerManager.setScanMode(ScannerManager.SCAN_KEY_HOLD_MODE);
break;
default:
break;
}
}
});
// mAutoCheckBox = (CheckBox) findViewById(R.id.checkBox_auto);
// mAutoCheckBox.setChecked(mAutoScan);
// mAutoCheckBox.setOnCheckedChangeListener(new
// OnCheckedChangeListener() {
// @Override
// public void onCheckedChanged(CompoundButton buttonView, boolean
// isChecked) {
// mAutoScan = isChecked;
// mHandle.sendEmptyMessage(AUTO_SCAN);
// }
// });
mSingleScanButton = (Button) findViewById(R.id.single_button);
mContinousScanButton = (Button) findViewById(R.id.continuous_button);
mListView.setAdapter(mListAdaper);
}
//恢復狀態,用來恢復
public void onResume() {
super.onResume();
switch (mScannerManager.getScanMode()) { //獲取 這個狀態,如果是連掃模式,那么單掃不可用,自動測驗可用
case ScannerManager.SCAN_CONTINUOUS_MODE:
mSingleScanButton.setEnabled(false);
mContinuousButton.setChecked(true);
mAutoTestButton.setEnabled(false);
break;
case ScannerManager.SCAN_KEY_HOLD_MODE: //如果是自動測驗,那么前面兩個不可用
mContinousScanButton.setEnabled(false);
mSingleScanButton.setEnabled(false);
mKeyHoldButton.setChecked(true);
break;
case ScannerManager.SCAN_SINGLE_MODE: //單掃模式
default:
mContinousScanButton.setEnabled(false);
mSingleButton.setChecked(true);
break;
}
}
/*
* public boolean dispatchKeyEvent(KeyEvent event) { if(event.getKeyCode()
* == KeyEvent.KEYCODE_BUTTON_A) {
* mScannerManager.dispatchScanKeyEvent(event); return true; } return
* super.dispatchKeyEvent(event);
*
* }
*/
//這兩個按扭事件一個意思就是為了防止長按,設定了一個策略,如果長按,那么為false也就是不會執行
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (event.getKeyCode())
{
case KeyEvent.KEYCODE_BUTTON_A: {
if (!mIsScanKeyDown) { //如果非按下狀態,
pressed++;//按下計數器增加
mScannerManager.dispatchScanKeyEvent(event);//這個才是主要事件,呼叫sdk方法,觸發掃描SDK掃描事件
// mScannerManager.triggerLevel(ScannerManager.LOW_LEVEL);
mHandle.sendEmptyMessage(4097); //添加資料,添加資料的IP為4097,意思就是升級記錄條數
mIsScanKeyDown = true; //設定為真,防止連續按
}
return true;
}
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (event.getKeyCode())
{
case KeyEvent.KEYCODE_BUTTON_A: {
if (mIsScanKeyDown) { //觸發按下彈起事件
mIsScanKeyDown = false;
mScannerManager.dispatchScanKeyEvent(event);
// mScannerManager.triggerLevel(ScannerManager.HIGH_LEVEL);
}
return true;
}
}
return super.onKeyUp(keyCode, event);
}
public void onClear(View view) {
clear();
}
//啟動自動測驗,跳到新視窗
public void onAutoTest(View view) {
Intent intent = new Intent();
intent.setClassName("com.zltd.scantest", "com.zltd.scantest.AutoTestActivity");
startActivity(intent);
}
//計數器顯示在文本標簽
public void updateCount() {
mTextView.setText("Scan: " + pressed + "times\nResult: " + scanned + "times");
}
//添加文本的方法
@Override
public void updateList(String data) {
//mBarcodeList.add(0, data);
//mListAdaper.notifyDataSetChanged();
mTextView.setText(data);
}
public void singleShootOnClick(View view) {
mScannerManager.singleScan();
}
//連掃事件
public void continuousShootOnClick(View view) {
if(!inContinuousShoot){
inContinuousShoot = true;
mScannerManager.startContinuousScan();
} else {
inContinuousShoot = false;
mScannerManager.stopContinuousScan();
}
}
}
uj5u.com熱心網友回復:
/**
* Project Name:YTOInfield File Name:SoundManager.java Package
* Name:cn.net.yto.infield.biz Date:2013-3-7 am 10:10:13 Copyright (c) 2013,
* zhiliantiandi All Rights Reserved.
*/
package com.juri.juriscanner;
import com.juri.juriscanner.R;
import android.content.Context; //背景關系
import android.media.AudioManager;
import android.media.SoundPool;
/**
* ClassName:SoundManager <br/>
* Date: 2013-3-7 am 10:10:13 <br/>
*
* @author Liliang
* @version
* @since JDK 1.6
* @see
*/
//加了final的話,這個類無法繼承的
public final class SoundUtils {
//定義聲音的三種狀態,成功為0,警告為1,查詢為2
public static final int SOUND_TYPE_SUCCESS = 0; //靜態變數,這樣就保證了只有一份
public static final int SOUND_TYPE_WARNING = 1;
public static final int SOUND_TYPE_QUERY = 2;
private static SoundUtils sManager; //實體本身,因為這個類不打算繼承,那么只有只有通過實體化來獵取
private float mStreamVolume = 0.1f;
private Context mContext; //背景關系選單
private int mWarningId = R.raw.warning; //這里是資源ID
private int mSuccessId = R.raw.success;
private int mQueryId = R.raw.query;
private boolean isPlay = true; //默認為正在播放
//構造方法
private SoundUtils() {
}
//初始化,他這個奇怪的在于,寫在里面了,原因是因為不想繼承,只有這個辦法,實體化物件
public static SoundUtils getInstance() {
if (sManager == null) {
sManager = new SoundUtils();
}
return sManager;
}
//初始化
public void init(Context context) {
if (mContext == null || mSoundPool == null) {
mContext = context;
loadSoundResources(context);
}
}
//初始化方法
public void init(Context context, int warningId, int successId, int queryId) {
if (mContext == null || mSoundPool == null) {
mContext = context;
mWarningId = warningId;
mSuccessId = successId;
mQueryId = queryId;
loadSoundResources(context);
}
}
//是否可用,默認是可用的
public void enablePlay(boolean enable) {
isPlay = enable; //賦值
}
//獲取 狀態
public boolean getPlay() {
return isPlay;
}
/**
* playSound:Play sound for scan. <br/>
*
* @author Liliang
* @param soundType One of {@link #SOUND_TYPE_SUCCESS},
* {@link #SOUND_TYPE_WARNING}, or {@link #SOUND_TYPE_QUERY}
* @since JDK 1.6
*/
//播放聲音,引數為型別,不同的聲音種類
public void playSound(int soundType) {
if (!isPlay)
return; //如果不允許播,那么直接回傳
int soundResId = mSoundSuccessId; //默認是成功的
switch (soundType) {
case SOUND_TYPE_SUCCESS:
soundResId = mSoundSuccessId;
break;
case SOUND_TYPE_WARNING:
soundResId = mSoundWarningId;
break;
case SOUND_TYPE_QUERY:
soundResId = mSoundQueryId;
break;
default:
break;
}
mSoundPool.play(soundResId, getVolume(), getVolume(), 1, 0, 1f);
}
//播放其他的聲音
public void playOther(int resourceId) {
if (!isPlay)
return;
int id = mSoundPool.load(mContext, resourceId, 1);
mSoundPool.play(id, getVolume(), getVolume(), 1, 0, 1f);
}
//播放警告
public void warn() {
if (!isPlay)
return;
mSoundPool.play(mSoundWarningId, getVolume(), getVolume(), 1, 0, 1f);
}
//左右分開
public void warn(float leftVolume, float rightVolume) {
if (!isPlay)
return;
mSoundPool
.play(mSoundWarningId, leftVolume, rightVolume, 1, 0, 1f);
}
//播放正確的
public void success() {
if (!isPlay)
return;
mSoundPool
.play(mSoundSuccessId, getVolume(), getVolume(), 1, 0, 1f);
}
//正確的左右
public void success(float leftVolume, float rightVolume) {
if (!isPlay)
return;
mSoundPool
.play(mSoundSuccessId, leftVolume, rightVolume, 1, 0, 1f);
}
public void query() {
if (!isPlay)
return;
mSoundPool.play(mSoundQueryId, getVolume(), getVolume(), 1, 0, 1f);
}
public void query(float leftVolume, float rightVolume) {
if (!isPlay)
return;
mSoundPool.play(mSoundQueryId, leftVolume, rightVolume, 1, 0, 1f);
}
//聲音大小
private float getVolume() {
return 0.8f;
}
private void loadSoundResources(Context context) {
release();
if (mSoundPool == null) {
mSoundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
mSoundWarningId = mSoundPool.load(context, mWarningId, 1);
mSoundSuccessId = mSoundPool.load(context, mSuccessId, 1);
mSoundQueryId = mSoundPool.load(context, mQueryId, 1);
}
}
//關閉資源,停止播放
public void release() {
if (mSoundPool != null) {
mSoundPool.release();
}
mSoundPool = null;
}
//定義三個自定義物件,用來播放聲音
private SoundPool mSoundPool;
private int mSoundWarningId;
private int mSoundSuccessId;
private int mSoundQueryId;
}
我簡單的想測驗下
package com.juri.juricode;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
//下面代碼為段濤于2020年5月6日手工撰寫,今天完工,做個最好的
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.widget.TextView;
import android.widget.EditText;
import android.widget.ListView;
//匯入支持庫
import com.zltd.decoder.Constants;
import com.zltd.decoder.DecoderManager;
import com.zltd.industry.ScannerManager;
//呼叫SDK介面
public class MainActivity extends AppCompatActivity implements ScannerManager.IScannerStatusListener {
//定義幾個全域變數
ScannerManager mScannerManager;
TextView mTV;
private static final int UPDATE_LIST = 4096;
private static final int UPDATE_NUMBER = 4097;
public boolean isScankeyDown = false; //默認是彈起的
//定義一個Handler物件用來更新UI
protected Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
switch (msg.what) {
case UPDATE_LIST:
mTV.setText((String) msg.obj);
default:
break;
}
return false;
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mScannerManager = ScannerManager.getInstance();//初始化實體
mTV = findViewById(R.id.mTV);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_BUTTON_A:
if (!isScankeyDown) {
mScannerManager.dispatchScanKeyEvent(event);
isScankeyDown = true; //如果不是是按下狀態,那么設為按下去的
}
return true; //回傳為真,就是彈起來的意思
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_BUTTON_A:
if (isScankeyDown) {
isScankeyDown = false; //如果是按下狀態,那么設為彈起來的
mScannerManager.dispatchScanKeyEvent(event);
}
return true; //回傳為真,就是彈起來的意思
}
return super.onKeyUp(keyCode, event);
}
@Override
public void onScannerStatusChanage(int i) {
}
@Override
public void onScannerResultChanage(byte[] arg0) {
String data = new String(arg0);
Message msg = mHandler.obtainMessage(UPDATE_LIST, data); //接收訊息,發送訊息
mHandler.sendMessage(msg);
}
}
為啥不起作用了
uj5u.com熱心網友回復:
你這長篇的代碼,常人是難以閱讀的。uj5u.com熱心網友回復:
還不如直接貼例外,這咋看uj5u.com熱心網友回復:
大哥,直接貼錯誤吧,可以加log除錯。Log.d("");
你這個貼上來的代碼太長長長了,恐怕只有編譯器才能看出錯誤。
uj5u.com熱心網友回復:
是呵,能縮小問題代碼的范圍,興許大家還能抓住重點,找到問題。這么長段代碼review,恐怕難以耐心、聚焦。
uj5u.com熱心網友回復:
哈哈,感覺像是在看高中英語的閱讀理解,討厭那玩意。uj5u.com熱心網友回復:
代碼略長啊。。。uj5u.com熱心網友回復:
智聯的代碼,有關輸入按鍵部分的處理你看懂了么?恐怕你的代碼有關消除長按輸入部分有問題,把正常輸入屏蔽了。你再仔細考慮考慮。uj5u.com熱心網友回復:
我看一篇帖子 最多 30秒
uj5u.com熱心網友回復:
膜拜大神
uj5u.com熱心網友回復:
試著不要一下子精簡那么多,或者就能明白是哪里搞錯了轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/33743.html
標籤:Android
上一篇:swift函式求助
