所以我在android 4.4中遇到了自定义样式的问题。
如果有人知道问题是什么或Android 4.4中的额外内容导致自定义样式无法启动请帮助。
这是我使用的代码,它在Android 2.2高达4.3(使用手机和模拟器测试)上运行完美。
布局:
<com.example.mobile.view.CustomCell
xmlns:cc="http://schemas.android.com/apk/res/com.example.mobile"
android:id="@+id/B1"
android:layout_width="fill_parent"
android:layout_height="@dimen/customcell_height"
android:inputType="number|numberDecimal"
cc:editable="false"
cc:labelText="@string/GrossIncome" />
类别:
package com.example.mobile.view;
public class CustomCell extends RelativeLayout implements TextWatcher {
private Context mContext;
private AttributeSet mAttributeSet;
private TextView mTextViewLabel;
private EditText mEditTextValue;
private boolean mEditable = false;
private CellUpdateListener mCellUpdateListener;
public CustomCell(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
mContext = context;
mAttributeSet = attributeSet;
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.customcell, this);
mTextViewLabel = (TextView) findViewById(R.id.customcell_label);
mEditTextValue = (EditText) findViewById(R.id.customcell_value);
Typeface tf = Typeface.createFromAsset(context.getAssets(),
"fonts/Calibri.ttf");
mTextViewLabel.setTypeface(tf);
mEditTextValue.setTypeface(tf);
parseAttributes();
}
private void parseAttributes() {
String text = null;
TypedArray a = mContext.obtainStyledAttributes(mAttributeSet,
R.styleable.com_example_mobile_view_CustomCell);
CharSequence s = a
.getString(R.styleable.com_example_mobile_view_CustomCell_labelText);
if (s != null) {
text = s.toString();
setLabelText(text);
}
s = a.getString(R.styleable.com_example_mobile_view_CustomCell_valueText);
if (s != null) {
text = s.toString();
setTextValue(text);
}
boolean b = a.getBoolean(
R.styleable.com_example_mobile_view_CustomCell_editable,
true);
setEditable(b);
b = a.getBoolean(
R.styleable.com_example_mobile_view_CustomCell_highlight,
false);
if (b) {
Drawable drawable = this.getResources().getDrawable(
R.drawable.input_highlighted);
findViewById(R.id.customcell).setBackgroundDrawable(drawable);
findViewById(R.id.customcell).setPadding(0, 0, 0, 0);
}
mEditTextValue.setInputType(a
.getInt(R.styleable.com_example_mobile_view_CustomCell_android_inputType,
InputType.TYPE_CLASS_TEXT));
a.recycle();
}
public void setCellUpdateListener(CellUpdateListener cellUpdateListener) {
mCellUpdateListener = cellUpdateListener;
}
public void setOnFocusChangeListener(OnFocusChangeListener l) {
mEditTextValue.setOnFocusChangeListener(l);
mEditTextValue.setInputType(InputType.TYPE_NULL);
}
private void notifyCellUpdateListener() {
if (mCellUpdateListener != null) {
mCellUpdateListener.onCellUpdate(this);
}
}
public void setEditable(boolean editable) {
mEditable = editable;
mEditTextValue.setEnabled(editable);
mEditTextValue.setFocusableInTouchMode(editable);
mEditTextValue.setFocusable(editable);
if (mEditable) {
mEditTextValue.setBackgroundResource(R.drawable.border);
mEditTextValue.addTextChangedListener(this);
} else {
mEditTextValue.removeTextChangedListener(this);
}
}
public String getLabelText() {
return (String) mTextViewLabel.getText();
}
public void setLabelText(String label) {
this.mTextViewLabel.setText(label);
}
public String getTextValue() {
return mEditTextValue.getEditableText().toString();
}
public void setTextValue(String value) {
mEditTextValue.removeTextChangedListener(this);
mEditTextValue.setText(value);
mEditTextValue.addTextChangedListener(this);
}
public int getIntValue() {
int value = 0;
String string = mEditTextValue.getEditableText().toString();
String cleanString = cleanString(string);
if (!TextUtils.isEmpty(cleanString)
&& !(cleanString.length() == 1 && !TextUtils
.isDigitsOnly(cleanString))) {
value = Integer.valueOf(cleanString);
}
return value;
}
public void setIntValue(int value) {
DecimalFormat nf = (DecimalFormat) NumberFormat.getInstance();
nf.setNegativePrefix("(");
nf.setNegativeSuffix(")");
nf.setMaximumFractionDigits(0);
String formated = nf.format(value);
mEditTextValue.removeTextChangedListener(this);
this.mEditTextValue.setText(formated);
mEditTextValue.setSelection(formated.length());
mEditTextValue.addTextChangedListener(this);
}
public void setIntValueWithPercentage(int value) {
DecimalFormat nf = (DecimalFormat) NumberFormat.getInstance();
nf.setNegativePrefix("(");
nf.setNegativeSuffix(")");
nf.setMaximumFractionDigits(0);
String formated = nf.format(value);
formated += " %";
mEditTextValue.removeTextChangedListener(this);
this.mEditTextValue.setText(formated);
String symbol = "%";
int symbolIndex = formated.indexOf(symbol);
if (symbolIndex == 0 || symbolIndex < 0) {
mEditTextValue.setSelection(formated.length());
} else {
mEditTextValue.setSelection(symbolIndex - 1);
}
mEditTextValue.addTextChangedListener(this);
}
public void setIntValueWithCurrency(int value) {
DecimalFormat nf = (DecimalFormat) NumberFormat.getCurrencyInstance();
nf.setNegativePrefix("(");
nf.setNegativeSuffix(")");
nf.setMaximumFractionDigits(0);
String formated = nf.format(value);
mEditTextValue.removeTextChangedListener(this);
this.mEditTextValue.setText(formated);
String symbol = nf.getCurrency().getSymbol();
int symbolIndex = formated.indexOf(symbol);
if (symbolIndex == 0 || symbolIndex < 0) {
mEditTextValue.setSelection(formated.length());
} else {
mEditTextValue.setSelection(symbolIndex - 1);
}
mEditTextValue.addTextChangedListener(this);
}
int getNumberOfDecimalPlace(String value) {
String string = stripSymbols(value);
DecimalFormat format = (DecimalFormat) NumberFormat.getInstance();
DecimalFormatSymbols symbols = format.getDecimalFormatSymbols();
final int index = string.lastIndexOf(symbols.getDecimalSeparator());
if (index < 0) {
return 0;
}
return string.length() - 1 - index;
}
public float getFloatValue() {
float value = 0;
String string = mEditTextValue.getEditableText().toString();
String cleanString = cleanString(string);
if (!TextUtils.isEmpty(cleanString)
&& !(cleanString.length() == 1 && !TextUtils
.isDigitsOnly(cleanString))) {
value = Float.valueOf(cleanString);
// int exp = getNumberOfDecimalPlace(string);
value /= Math.pow(10, 2);
}
return value;
}
public void setFloatValue(float value) {
DecimalFormat nf = (DecimalFormat) NumberFormat.getInstance();
nf.setNegativePrefix("(");
nf.setNegativeSuffix(")");
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
String formated = nf.format(value);
mEditTextValue.removeTextChangedListener(this);
this.mEditTextValue.setText(formated);
mEditTextValue.setSelection(formated.length());
mEditTextValue.addTextChangedListener(this);
}
public void setFloatValueWithPercentage(float value) {
DecimalFormat nf = (DecimalFormat) NumberFormat.getInstance();
nf.setNegativePrefix("(");
nf.setNegativeSuffix(")");
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
String formated = nf.format(value);
formated += " %";
mEditTextValue.removeTextChangedListener(this);
this.mEditTextValue.setText(formated);
String symbol = "%";
int symbolIndex = formated.indexOf(symbol);
if (symbolIndex == 0 || symbolIndex < 0) {
mEditTextValue.setSelection(formated.length());
} else {
mEditTextValue.setSelection(symbolIndex - 1);
}
mEditTextValue.addTextChangedListener(this);
}
public void setFloatValueWithCurrency(float value) {
DecimalFormat nf = (DecimalFormat) NumberFormat.getCurrencyInstance();
nf.setNegativePrefix("(");
nf.setNegativeSuffix(")");
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
String formated = nf.format(value);
mEditTextValue.removeTextChangedListener(this);
this.mEditTextValue.setText(formated);
String symbol = nf.getCurrency().getSymbol();
int symbolIndex = formated.indexOf(symbol);
if (symbolIndex == 0 || symbolIndex < 0) {
mEditTextValue.setSelection(formated.length());
} else {
mEditTextValue.setSelection(symbolIndex - 1);
}
mEditTextValue.addTextChangedListener(this);
}
String stripSymbols(String string) {
if (string == null)
return "";
String replaceable = "["
+ NumberFormat.getCurrencyInstance().getCurrency()
.getSymbol() + "%\\(\\)\\s]";
String cleanString = string.replaceAll(replaceable, "");
return cleanString;
}
String cleanString(String string) {
if (string == null)
return "";
String replaceable = "["
+ NumberFormat.getCurrencyInstance().getCurrency()
.getSymbol() + "%,.\\s]";
String cleanString = string.replaceAll(replaceable, "");
if (cleanString.contains("(")) {
cleanString.replaceAll("\\(\\)", "");
cleanString = "-" + cleanString;
}
return cleanString;
}
@Override
public void afterTextChanged(Editable s) {
notifyCellUpdateListener();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
}