fix: 控件库化
This commit is contained in:
1
corelibrary/.gitignore
vendored
Normal file
1
corelibrary/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/build
|
||||
31
corelibrary/build.gradle
Normal file
31
corelibrary/build.gradle
Normal file
@@ -0,0 +1,31 @@
|
||||
apply plugin: 'com.android.library'
|
||||
|
||||
android {
|
||||
compileSdkVersion 24
|
||||
buildToolsVersion "25.0.0"
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 15
|
||||
targetSdkVersion 24
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
|
||||
}
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile fileTree(dir: 'libs', include: ['*.jar'])
|
||||
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
|
||||
exclude group: 'com.android.support', module: 'support-annotations'
|
||||
})
|
||||
compile 'com.android.support:appcompat-v7:24.2.1'
|
||||
testCompile 'junit:junit:4.12'
|
||||
}
|
||||
17
corelibrary/proguard-rules.pro
vendored
Normal file
17
corelibrary/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
# Add project specific ProGuard rules here.
|
||||
# By default, the flags in this file are appended to flags specified
|
||||
# in /Users/liuguangli/Library/Android/sdk/tools/proguard/proguard-android.txt
|
||||
# You can edit the include path and order by changing the proguardFiles
|
||||
# directive in build.gradle.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# Add any project specific keep options here:
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.dalimao.corelibrary;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.test.InstrumentationRegistry;
|
||||
import android.support.test.runner.AndroidJUnit4;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Instrumentation test, which will execute on an Android device.
|
||||
*
|
||||
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||
*/
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class ExampleInstrumentedTest {
|
||||
@Test
|
||||
public void useAppContext() throws Exception {
|
||||
// Context of the app under test.
|
||||
Context appContext = InstrumentationRegistry.getTargetContext();
|
||||
|
||||
assertEquals("com.dalimao.corelibrary.test", appContext.getPackageName());
|
||||
}
|
||||
}
|
||||
9
corelibrary/src/main/AndroidManifest.xml
Normal file
9
corelibrary/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.dalimao.corelibrary">
|
||||
|
||||
<application android:allowBackup="true" android:label="@string/app_name"
|
||||
android:supportsRtl="true">
|
||||
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
@@ -0,0 +1,206 @@
|
||||
/*
|
||||
* Copyright (C) 2013 UCWeb Inc. All rights reserved
|
||||
* 本代码版权归UC优视科技所有。
|
||||
* UC游戏交易平台为优视科技(UC)旗下的手机游戏交易平台产品
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
package com.dalimao.corelibrary;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.text.Editable;
|
||||
import android.text.InputFilter;
|
||||
import android.text.InputType;
|
||||
import android.text.TextWatcher;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.EditText;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public class VerificationCodeInput extends ViewGroup {
|
||||
|
||||
private static final String TAG = "VerificationCodeInput";
|
||||
private int box = 4;
|
||||
private int boxWidth = 120;
|
||||
private int boxHeight = 120;
|
||||
private int childHPadding = 14;
|
||||
private int childVPadding = 14;
|
||||
private Drawable boxBg = null;
|
||||
private EditText currentFocusChild;
|
||||
private Listener listener;
|
||||
|
||||
public VerificationCodeInput(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.vericationCodeInput);
|
||||
box = a.getInt(R.styleable.vericationCodeInput_box, 4);
|
||||
|
||||
childHPadding = (int) a.getDimension(R.styleable.vericationCodeInput_child_h_padding, 0);
|
||||
childVPadding = (int) a.getDimension(R.styleable.vericationCodeInput_child_v_padding, 0);
|
||||
boxBg = a.getDrawable(R.styleable.vericationCodeInput_box_bg);
|
||||
initViews();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onAttachedToWindow() {
|
||||
super.onAttachedToWindow();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDetachedFromWindow() {
|
||||
super.onDetachedFromWindow();
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void initViews() {
|
||||
TextWatcher textWatcher = new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||
if (s.length() == 1) {
|
||||
EditText editText = (EditText) getChildAt((currentFocusChild.getId() + 1) % box);
|
||||
editText.requestFocus();
|
||||
currentFocusChild = editText;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable s) {
|
||||
checkAndCommit();
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
for (int i = 0; i < box; i++) {
|
||||
EditText editText = new EditText(getContext());
|
||||
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(boxWidth, boxHeight);
|
||||
layoutParams.bottomMargin = childVPadding;
|
||||
layoutParams.topMargin = childVPadding;
|
||||
layoutParams.leftMargin = childHPadding;
|
||||
layoutParams.rightMargin = childHPadding;
|
||||
layoutParams.gravity = Gravity.CENTER;
|
||||
editText.setBackground(boxBg);
|
||||
editText.setLayoutParams(layoutParams);
|
||||
editText.setGravity(Gravity.CENTER);
|
||||
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(1)});
|
||||
editText.setCursorVisible(false);
|
||||
editText.setInputType(InputType.TYPE_CLASS_NUMBER);
|
||||
editText.setId(i);
|
||||
editText.setEms(1);
|
||||
editText.addTextChangedListener(textWatcher);
|
||||
addView(editText,i);
|
||||
if (i == 0) {
|
||||
editText.requestFocus();
|
||||
currentFocusChild = editText;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void checkAndCommit() {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
boolean full = true;
|
||||
for (int i = 0 ;i < box; i++){
|
||||
EditText editText = (EditText) getChildAt(i);
|
||||
String content = editText.getText().toString();
|
||||
if ( content.length() == 0) {
|
||||
full = false;
|
||||
break;
|
||||
} else {
|
||||
stringBuilder.append(content);
|
||||
}
|
||||
|
||||
}
|
||||
Log.d(TAG, "checkAndCommit:" + stringBuilder.toString());
|
||||
if (full){
|
||||
|
||||
if (listener != null) {
|
||||
listener.onComplete(stringBuilder.toString());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void setOnCompleteListener(Listener listener){
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
public LayoutParams generateLayoutParams(AttributeSet attrs) {
|
||||
return new LinearLayout.LayoutParams(getContext(), attrs);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||
Log.d(getClass().getName(), "onMeasure");
|
||||
int count = getChildCount();
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
View child = getChildAt(i);
|
||||
this.measureChild(child, widthMeasureSpec, heightMeasureSpec);
|
||||
}
|
||||
if (count > 0) {
|
||||
View child = getChildAt(0);
|
||||
int cHeight = child.getMeasuredHeight();
|
||||
int cWidth = child.getMeasuredWidth();
|
||||
int maxH = cHeight + 2 * childVPadding;
|
||||
int maxW = (cWidth + childHPadding) * box + childHPadding;
|
||||
setMeasuredDimension(resolveSize(maxW, widthMeasureSpec),
|
||||
resolveSize(maxH, heightMeasureSpec));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
||||
Log.d(getClass().getName(), "onLayout");
|
||||
int childCount = getChildCount();
|
||||
|
||||
for (int i = 0; i < childCount; i++) {
|
||||
View child = getChildAt(i);
|
||||
|
||||
child.setVisibility(View.VISIBLE);
|
||||
int cWidth = child.getMeasuredWidth();
|
||||
int cHeight = child.getMeasuredHeight();
|
||||
int cl = (i) * (cWidth + childHPadding);
|
||||
int cr = cl + cWidth;
|
||||
int ct = childVPadding;
|
||||
int cb = ct + cHeight;
|
||||
child.layout(cl, ct, cr, cb);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static interface Listener {
|
||||
void onComplete(String content);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_window_focused="false">
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="#FaFafa" />
|
||||
<corners android:radius="3dip"/>
|
||||
<stroke
|
||||
android:width="1dip"
|
||||
android:color="#BDC7D8" />
|
||||
</shape>
|
||||
</item>
|
||||
<item android:state_focused="true" >
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="#FFFFFF" />
|
||||
<corners android:radius="3dip"/>
|
||||
<stroke
|
||||
android:width="1dip"
|
||||
android:color="#ffee33" />
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
||||
12
corelibrary/src/main/res/values/attrs.xml
Normal file
12
corelibrary/src/main/res/values/attrs.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<declare-styleable name="vericationCodeInput">
|
||||
|
||||
<attr name="box" format="integer" />
|
||||
<attr name="child_h_padding" format="dimension"/>
|
||||
<attr name="child_v_padding" format="dimension"/>
|
||||
<attr name="padding" format="dimension"/>
|
||||
<attr name="box_bg" format="reference"/>
|
||||
</declare-styleable>
|
||||
|
||||
</resources>
|
||||
3
corelibrary/src/main/res/values/strings.xml
Normal file
3
corelibrary/src/main/res/values/strings.xml
Normal file
@@ -0,0 +1,3 @@
|
||||
<resources>
|
||||
<string name="app_name">CoreLibrary</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.dalimao.corelibrary;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||
*/
|
||||
public class ExampleUnitTest {
|
||||
@Test
|
||||
public void addition_isCorrect() throws Exception {
|
||||
assertEquals(4, 2 + 2);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user