編輯:關於Android編程
之前博客中,介紹過使用谷歌提供的鍵盤的一些api,可以很好地自定義鍵盤,這個有一個局限性,只能占滿屏幕,無法做到只能占一部分的需求鍵盤,如下圖我平板中的鍵盤需求:(由於公司保密需要,所以比較恐怖一點,嘿嘿)
類似於上方的左下角的一小塊鍵盤,這就不能使用系統自帶的一些鍵盤api,需要自己寫布局,並且對輸入的金額進行位數的限制,以及一些欄位輸入的整數和小數位的控制,整體的實現步驟如下;
1.點擊某個edittext,彈出下方的鍵盤(也就是使用popuwindow的方式),需要監聽edittext獲得焦點以及點擊的事件,還需要隱藏掉系統自帶的鍵盤,如下:
limitEditText = (EditText) fragmentLayout.findViewById(R.id.ordertrade_limit_price); //禁止系統鍵盤彈出 MainActionUtilHelper.hideSoftInputMethod(limitEditText, getActivity()); digit = allone.verbank.apad.client.util.InstrumentUtil.getDigitByInstrument(instName); limitEditText.setOnFocusChangeListener(new android.view.View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { if (popupMenu != null) { popupMenu.destroyPopupMenu(); } popupMenu = PopupMenuFactory.createPopupWindowKeyBoard(getActivity(), limitEditText, order_amount_layout, IPopupMenu.MENU_TYPE_JPY, digit == 2, digit); popupMenu.showPopupMenu(); popupMenu.createPupupWindow().setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { } }); } else { // 此處為失去焦點時的處理內容 } } }); //監聽彈出數字鍵盤 limitEditText.setOnClickListener(new OnClickListener() { @Override public void onClick(View vi) { if (popupMenu != null) { popupMenu.destroyPopupMenu(); } // 浮出菜單 popupMenu = PopupMenuFactory.createPopupWindowKeyBoard(getActivity(), limitEditText, order_amount_layout, IPopupMenu.MENU_TYPE_JPY, digit == 2, digit); popupMenu.showPopupMenu(); popupMenu.createPupupWindow().setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { } }); } }); //======================================================================================(2)隱藏系統自帶的鍵盤,方法如下,需要傳入activity和edittext控件,如下代碼:
/** * 隱藏系統鍵盤 * * @param ed * @author qiulinhe * @createTime 2016年5月31日 下午1:50:33 */ public static void hideSoftInputMethod(EditText ed, Activity activity) { activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); int currentVersion = android.os.Build.VERSION.SDK_INT; String methodName = null; if (currentVersion >= 16) { // 4.2 methodName = "setShowSoftInputOnFocus"; } else if (currentVersion >= 14) { // 4.0 methodName = "setSoftInputShownOnFocus"; } if (methodName == null) { ed.setInputType(InputType.TYPE_NULL); } else { Classcls = EditText.class; Method setShowSoftInputOnFocus; try { setShowSoftInputOnFocus = cls.getMethod(methodName, boolean.class); setShowSoftInputOnFocus.setAccessible(true); setShowSoftInputOnFocus.invoke(ed, false); } catch (NoSuchMethodException e) { ed.setInputType(InputType.TYPE_NULL); e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
2.寫好popuwindow的xml布局文件,也就是你需要呈現的鍵盤布局,xml文件如下:
package allone.verbank.apad.client.component.menu.impl; import allone.verbank.apad.client.R; import allone.verbank.apad.client.component.menu.IPopupMenu; import allone.verbank.apad.client.util.SharepreferencesUtilSystemSettings; import android.app.Activity; import android.graphics.drawable.ColorDrawable; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.EditText; import android.widget.PopupWindow; import android.widget.TextView; import android.widget.Toast; /** * 數字鍵盤,點擊edittext控件,下方彈出鍵盤 * * @author qiulinhe * @createTime 2016年5月31日 上午10:33:20 */ public class DigitKeyboardPopupMenu implements IPopupMenu { private boolean isJPY; private int digit; //=============鍵盤數字初始化============ private TextView hide_keyboard;//隱藏鍵盤 private Button seven, eight, nine, first_selfdefine;//鍵盤的第一行 private Button four, five, six, second_selfdefine;//鍵盤的第一行 private Button one, two, three, three_selfdefine;//鍵盤的第一行 private Button double_zero, zero, donte, delete_btn;//鍵盤的第一行 private StringBuffer inputStringAdd = new StringBuffer();//用來存放輸入數字的sb //========================================== private PopupWindow popupMenu; private Activity activity; private EditText sourceEditView;//輸入的edittext,彈出鍵盤 private View keylinearlayout;//為了計算鍵盤的尺寸,傳入布局 private int keyboardType;//鍵盤類型 public DigitKeyboardPopupMenu(Activity activity, View sourceEditView, View sourLayout, int keyboardType, boolean ifJPY, int instrumentdigit) { this.activity = activity; this.sourceEditView = (EditText) sourceEditView; this.keylinearlayout = sourLayout; this.keyboardType = keyboardType; this.isJPY = ifJPY; this.digit = instrumentdigit; initComponent(); } private void initComponent() { //當從鍵盤切換到另一個鍵盤,重新回來,需要獲得原來的已經輸入的字符串 inputStringAdd.append(sourceEditView.getText().toString()); View view = activity.getLayoutInflater().inflate(R.layout.small_keyboard, null); // 創建彈出窗口 // 窗口內容為layoutLeft,裡面包含一個ListView // 窗口寬度跟tvLeft一樣 popupMenu = new PopupWindow(view, keylinearlayout.getWidth(), LayoutParams.WRAP_CONTENT); ColorDrawable cd = new ColorDrawable(R.color.white); popupMenu.setBackgroundDrawable(cd); popupMenu.setAnimationStyle(R.style.AnimBottom); popupMenu.update(); popupMenu.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); popupMenu.setTouchable(true); // 設置popupwindow可點擊 popupMenu.setOutsideTouchable(true); // 設置popupwindow外部可點擊 popupMenu.setFocusable(true); // 獲取焦點 popupMenu.setTouchInterceptor(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 如果點擊了popupwindow的外部,popupwindow也會消失 if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { popupMenu.dismiss(); return true; } return false; } }); //初始化鍵盤上的數字 initALLDig(view); } @Override public PopupWindow createPupupWindow() { return popupMenu; } @Override public void showPopupMenu() { if (popupMenu != null && popupMenu.isShowing()) { popupMenu.dismiss(); } else { //popupMenu.showAsDropDown(sourceEditView); popupMenu.showAtLocation(keylinearlayout, Gravity.BOTTOM | Gravity.LEFT, 0, 0); //設置layout在PopupWindow中顯示的位置 // popupMenu.showAsDropDown(sourceView, // Math.round(sourceView.getX()), // (int) (sourceView.getY())); } } @Override public void destroyPopupMenu() { } /** * 初始化鍵盤上的所有數字,進行監聽處理 * * @param view * @author qiulinhe * @createTime 2016年5月31日 下午2:24:34 */ private void initALLDig(View view) { // 自定義輸入金額key,2015年12月21日14:28:06:當用戶點擊自定義金額,清除掉之前的內容,輸入自定義金額 final String selfdig20 = SharepreferencesUtilSystemSettings.getValue(activity, "amount2", "200,000"); final String selfdig50 = SharepreferencesUtilSystemSettings.getValue(activity, "amount5", "500,000"); final String selfdig100 = SharepreferencesUtilSystemSettings.getValue(activity, "amount10", "1,000,000"); //=====================第一行,隱藏鍵盤的按鈕=============================== hide_keyboard = (TextView) view.findViewById(R.id.hide_keyboard); hide_keyboard.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { popupMenu.dismiss(); } }); //=================第二行,7,8,9,第一個自定義金額======================= seven = (Button) view.findViewById(R.id.seven); seven.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //追加數字 inputAppendData(seven); } }); eight = (Button) view.findViewById(R.id.eight); eight.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //追加數字 inputAppendData(eight); } }); nine = (Button) view.findViewById(R.id.nine); nine.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //追加數字 inputAppendData(nine); } }); first_selfdefine = (Button) view.findViewById(R.id.first_selfdefine); first_selfdefine.setText(selfdig20); first_selfdefine.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //如果是輸入為小數位,禁止自定義金額點擊 if (keyboardType == IPopupMenu.MENU_TYPE_JPY) { } else { String dValue = selfdig20; dValue = dValue.replace(",", ""); selfDefAppendData(dValue); } } }); //=================第二行4,5,6,第二個自定義金額======================= four = (Button) view.findViewById(R.id.four); four.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //追加數字 inputAppendData(four); } }); five = (Button) view.findViewById(R.id.five); five.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //追加數字 inputAppendData(five); } }); six = (Button) view.findViewById(R.id.six); six.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //追加數字 inputAppendData(six); } }); second_selfdefine = (Button) view.findViewById(R.id.second_selfdefine); second_selfdefine.setText(selfdig50); second_selfdefine.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //如果是輸入為小數位,禁止自定義金額點擊 if (keyboardType == IPopupMenu.MENU_TYPE_JPY) { } else { String dValue = selfdig50; dValue = dValue.replace(",", ""); selfDefAppendData(dValue); } } }); //=================第二行1,2,3,第三個自定義金額======================= one = (Button) view.findViewById(R.id.one); one.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //追加數字 inputAppendData(one); } }); two = (Button) view.findViewById(R.id.two); two.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //追加數字 inputAppendData(two); } }); three = (Button) view.findViewById(R.id.three); three.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //追加數字 inputAppendData(three); } }); three_selfdefine = (Button) view.findViewById(R.id.three_selfdefine); three_selfdefine.setText(selfdig100); three_selfdefine.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //如果是輸入為小數位,禁止自定義金額點擊 if (keyboardType == IPopupMenu.MENU_TYPE_JPY) { } else { String dValue = selfdig100; dValue = dValue.replace(",", ""); selfDefAppendData(dValue); } } }); //=================第二行00,0,.,第四個自定義金額======================= double_zero = (Button) view.findViewById(R.id.double_zero); double_zero.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //追加數字 inputAppendData(double_zero); } }); zero = (Button) view.findViewById(R.id.zero); zero.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //追加數字 inputAppendData(zero); } }); donte = (Button) view.findViewById(R.id.donte); donte.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //當鍵盤為輸入金額的時候,小數點不能點擊 if (keyboardType == IPopupMenu.MENU_TYPE_AMOUNT) { donte.setEnabled(false); } else { //如果已經有有一個小數點,則不能再點擊 if (sourceEditView.getText().toString().contains(".")) { donte.setEnabled(false); } else { //追加數字,只能有一個小數點 inputAppendData(donte); } } } }); delete_btn = (Button) view.findViewById(R.id.delete_btn); delete_btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //刪除功能 deleteAppendData(); } }); } /** * 點擊數字,進行追加 * * @author qiulinhe * @createTime 2016年5月31日 下午2:59:29 */ private void inputAppendData(Button digBtn) { //當鍵盤為輸入金額的時候,小數點不能點擊,且只能輸入7位數,不能輸入小數 if (keyboardType == IPopupMenu.MENU_TYPE_AMOUNT) { String oldValue = inputStringAdd.toString().trim(); String newValue = digBtn.getText().toString().trim();//千分位格式化 String dValue = oldValue + newValue; if (!dValue.equals("") && dValue.length() > 7) { Toast.makeText(activity, activity.getString(R.string.customdialogpricemodify_onlyseven), Toast.LENGTH_SHORT) .show(); } else { inputStringAdd.append(digBtn.getText().toString().trim()); sourceEditView.setText(inputStringAdd.toString().trim()); //設置光標位於最後一位 sourceEditView.setSelection(sourceEditView.getText().length()); } } else if (keyboardType == IPopupMenu.MENU_TYPE_JPY) {//當商品含有JPY的,輸入的數值:整數位最多為3位,小數位最多為2位 sourceEditView.setText(inputStringAdd.append(ifJPYReturnData(digBtn))); //設置光標位於最後一位 sourceEditView.setSelection(sourceEditView.getText().length()); } } /** * 如果是JPY的,進行判斷,返回數據 * * @param digBtn * @author qiulinhe * @createTime 2016年6月1日 上午10:45:19 */ private String ifJPYReturnData(Button digBtn) { String oriValue = inputStringAdd.toString().trim(); StringBuffer sb = new StringBuffer(oriValue); sb.append(digBtn.getText().toString().trim()); String newValue = sb.toString(); String[] newValueVec = newValue.split("\\."); if (newValueVec.length == 2) { double number = Double.parseDouble(newValueVec[0]); boolean numberflag = true; if (isJPY) { numberflag = ((number - 999 > 0.000001) ? false : true); } else { numberflag = ((number - 99 > 0.000001) ? false : true); } boolean digitflag = true; try { String digitNumber = newValueVec[1]; digitflag = digitNumber.toCharArray().length > digit ? false : true; } catch (Exception ex) { digitflag = false; } if (numberflag && digitflag) { return digBtn.getText().toString().trim(); } else { return ""; } } else { double value = Double.parseDouble(newValue); if (isJPY) { return value > 999 ? "" : digBtn.getText().toString().trim(); } else { return value > 99 ? "" : digBtn.getText().toString().trim(); } } } /** * 刪除功能 * * @author qiulinhe * @createTime 2016年5月31日 下午3:03:03 */ private void deleteAppendData() { //當鍵盤為輸入金額的時候,小數點不能點擊,且只能輸入7位數,不能輸入小數 if (keyboardType == IPopupMenu.MENU_TYPE_AMOUNT) { String dValue = sourceEditView.getText().toString(); //格式化之後重新賦值 inputStringAdd.setLength(0); inputStringAdd.append(dValue); if (inputStringAdd.length() - 1 >= 0) { inputStringAdd.delete(inputStringAdd.length() - 1, inputStringAdd.length()); sourceEditView.setText(inputStringAdd.toString().trim()); sourceEditView.setSelection(sourceEditView.getText().length()); } } else { if (inputStringAdd.length() - 1 >= 0) { inputStringAdd.delete(inputStringAdd.length() - 1, inputStringAdd.length()); sourceEditView.setText(inputStringAdd.toString().trim()); sourceEditView.setSelection(sourceEditView.getText().length()); } } } /** * 自定義金額,輸入自定義金額時,將原來的界面清空,填入自定義金額 * * @author qiulinhe * @createTime 2016年5月31日 下午3:04:02 */ private void selfDefAppendData(String selfData) { inputStringAdd.replace(0, inputStringAdd.length(), selfData); sourceEditView.setText(inputStringAdd.toString().trim()); sourceEditView.setSelection(sourceEditView.getText().length()); } }
一、資源管理器介紹現在在一些移動終端上面都會有自帶的資源管理器,其實其並非是Android系統自帶,而是手機產商與app開發商的合作而導致融合,借助第三方的開發軟件預裝在
修改文件路徑 android4.4\packages\apps\Browser\src\com\android\browser\BrowserSettings.java
基本概念AsyncTask:異步任務,從字面上來說,就是在我們的UI主線程運行的時候,異步的完成一些操作。AsyncTask允許我們的執行一個異步的任務在後台。我們可以將
Android圖片的拖拽與縮放2014年5月9日 我們在使用應用當中經常需要浏覽圖片,比如在微信當中,點擊圖片之後可以對圖片進行縮放。 本博客介紹如何對圖片進行拖拽和縮