के साथ एंड्रॉइड मनी इनपुट आप एक एडिटेक्स्ट एंट्री कैसे बनाते हैं जो केवल पैसे प्रारूप में इनपुट स्वरूपित करता है? जब उपयोगकर्ता 5 में प्रवेश करता है, तो मैं इनपुट को "$ 0.05" जैसा दिखाना चाहता हूं और जब वे 3 दर्ज करते हैं, तो इनपुट अब "$ 0.53" जैसा दिखना चाहिए और अंत में वे 6 दर्ज करें और इनपुट "$ 5.36" जैसा दिखना चाहिए।निश्चित दशमलव
उत्तर
आप इस तरह की चीज करने के लिए टेक्स्टवॉचर का उपयोग कर सकते हैं।
बढ़ाएँ TextWatcher: http://d.android.com/reference/android/text/TextWatcher.html
public class MyTextWatcher implements TextWatcher {
public void afterTextChanged(Editable arg0) {
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
}
फिर
myEditText.addTextChangedListener(new MyTextWatcher());
मैंने पाया TextWatcher थोड़ा बोझिल होने के लिए के साथ अपने editText में जोड़ें। इसके बजाय, आप कुंजी श्रोता सेट कर सकते हैं:
setKeyListener(new CalculatorKeyListener());
// Must be called after setKeyListener(), otherwise is overridden
setRawInputType(Configuration.KEYBOARD_12KEY);
और फिर एक KeyListener जो NumberKeyListener फैली बनाएँ:
class CalculatorKeyListener extends NumberKeyListener {
@Override
public int getInputType() {
return InputType.TYPE_CLASS_NUMBER;
}
@Override
public boolean onKeyDown(View view, Editable content, int keyCode, KeyEvent event) {
if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {
digitPressed(keyCode - KeyEvent.KEYCODE_0);
} else if (keyCode == KeyEvent.KEYCODE_DEL) {
deletePressed();
}
return true;
}
@Override
protected char[] getAcceptedChars() {
return new char[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
}
}
फिर आप पात्रों सही ढंग से प्रदर्शित करने की आवश्यकता है, लेकिन यह मुश्किल नहीं है; बस सेंट का ट्रैक रखें, और उसके बाद 10 से विभाजित या गुणा करें, और स्वरूपण को सही करने के लिए संख्याफॉर्मेट का उपयोग करें।
यहाँ मेरा पूर्ण समाधान:
tvValue.setRawInputType(Configuration.KEYBOARD_12KEY);
tvValue.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
// TODO Auto-generated method stub
// here i converted to string
if(!s.toString().matches("^\\$(\\d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$"))
{
String userInput= ""+s.toString().replaceAll("[^\\d]", "");
Float in=Float.parseFloat(userInput);
float percen = in/100;
tvValue.setText("$"+percen);
}
}
});
ninjasense के पूर्ण समाधान मूल रूप से काम करता है, लेकिन यह कुछ मुद्दे हैं:
- हर बार क्षेत्र के डेटा "onTextChanged" हैंडलर में बदल दिया जाता है, कर्सर की स्थिति फ़ील्ड पर इंडेक्स 0 पर रीसेट हो जाती है, जो मौद्रिक मानों में टाइप करते समय होने वाली थोड़ी परेशान होती है।
- यह मौद्रिक मूल्य स्वरूपण के लिए फ्लोट का उपयोग करता है, जो बैकफायर कर सकता है।
पहली समस्या मैं इस काम करता है की तरह एक दूसरे के कोड के लिए अभी तक समाधान नहीं है, के लिए:
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if(!s.toString().matches("^\\$(\\d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$"))
{
String userInput= ""+s.toString().replaceAll("[^\\d]", "");
StringBuilder cashAmountBuilder = new StringBuilder(userInput);
while (cashAmountBuilder.length() > 3 && cashAmountBuilder.charAt(0) == '0') {
cashAmountBuilder.deleteCharAt(0);
}
while (cashAmountBuilder.length() < 3) {
cashAmountBuilder.insert(0, '0');
}
cashAmountBuilder.insert(cashAmountBuilder.length()-2, '.');
cashAmountBuilder.insert(0, '$');
cashAmountEdit.setText(cashAmountBuilder.toString());
}
}
ZDS बंद का निर्माण।
फ़ील्ड के अंत में स्थित कर्सर को रखने के लिए इसका उपयोग करें।
cashAmountEdit.setTextKeepState(cashAmountBuilder.toString());
Selection.setSelection(cashAmountEdit.getText(), cashAmountBuilder.toString().length());
मैंने ऐसा किया लेकिन दशमलव के बिना और मील के लिए डॉट के साथ, कोड की जांच करें और दशमलव का समर्थन करने के लिए कार्यक्षमता जोड़ें।
MyEditText.addTextChangedListener(new TextWatcher()
{
@Override
public void onTextChanged(CharSequence s, int start, int before, int count){
if(s.toString().length() > 0){
MyEditText.removeTextChangedListener(this);
String numbers = removeCharacters(s.toString());
int money = 0;
try{
money = Integer.parseInt(numbers);
}
catch(Exception ex){
money = 0;
}
MyEditText.setText(getMoney(money));
//Set cursor on correct position
int selection = start;
if(count > 0){
selection++;
if(MyEditText.getText().toString().length() == 2 || MyEditText.getText().toString().length() == 6 || MyEditText.getText().toString().length() == 10){
selection++;
}
}
else{
if(MyEditText.getText().toString().length() == 4 || MyEditText.getText().toString().length() == 8){
selection--;
}
}
if(selection > MyEditText.getText().toString().length()){
selection = MyEditText.getText().toString().length();
}
MyEditText.setSelection(selection);
MyEditText.addTextChangedListener(this);
}
if(s.toString().length() == 1 && count < 1 && start == 1){
MyEditText.removeTextChangedListener(this);
MyEditText.setText("");
MyEditText.addTextChangedListener(this);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after){
}
@Override
public void afterTextChanged(Editable s)
{
}
});
public String removeCharacters(String money){
int i=0;
while (i<money.length())
{
Character c = money.charAt(i);
if (Character.isDigit(c) && c != '.')
{
i++;
}
else
{
money = money.replace(c.toString(), "");
}
}
return money;
}
public String getMoney(int value){
String money = "$";
NumberFormat numberFormatter;
numberFormatter = NumberFormat.getNumberInstance(Locale.GERMAN);
money += numberFormatter.format(value);
return money;
}
इस उत्तर Zds' answer (जो बारी में ninjasense's answer पर आधारित था) पर आधारित है, लेकिन यह कर्सर की स्थिति समस्या को हल करना चाहिए:
if(!text.matches("^\\$(\\d{1,2})(\\.\\d{2})?$")) {
int originalCursorPosition = view.getSelectionStart();
int cursorOffset = 0;
boolean cursorAtEnd = originalCursorPosition == text.length();
String userInput= ""+text.replaceAll("[^\\d]", "");
StringBuilder cashAmountBuilder = new StringBuilder(userInput);
while (cashAmountBuilder.length() > 3 && cashAmountBuilder.charAt(0) == '0') {
cashAmountBuilder.deleteCharAt(0);
cursorOffset--;
}
while (cashAmountBuilder.length() < 3) {
cashAmountBuilder.insert(0, '0');
cursorOffset++;
}
cashAmountBuilder.insert(cashAmountBuilder.length() - 2, '.');
cashAmountBuilder.insert(0, '$');
view.setText(cashAmountBuilder.toString());
view.setSelection(cursorAtEnd ? view.getText().length() : originalCursorPosition + cursorOffset);
}
नोट्स:
- निम्नलिखित
TextWatcher.onTextChanged
- में एक अलग उपयोग कर रहा है अन्य उत्तर से regex, जो < के मूल्य रखता है $ 100
- 'दृश्य' है editText, 'पाठ' स्ट्रिंग सामग्री 6 के एक
maxLength
साथ - यह मेरे लिए काम किया है एक
EditText
उपयोग कर रहा है (अर्थात $ 00,00)
KeyListener नहीं रह गया है कुछ उपकरणों पर काम कर रहा है, इस नोट देखें: मुलायम इनपुट विधियों पर कुंजी प्रेस इस श्रोता में तरीकों को गति प्रदान करने की आवश्यकता नहीं है, और वास्तव में ऐसा करने के लिए हतोत्साहित किया जाता है। डिफ़ॉल्ट एंड्रॉइड कीबोर्ड जेली बीन या बाद में किसी भी एप्लिकेशन को लक्षित करने के लिए किसी भी कुंजी के लिए इन्हें ट्रिगर नहीं करेगा, और केवल इसे आइस क्रीम सैंडविच को लक्षित करने वाले अनुप्रयोगों के लिए कुछ महत्वपूर्ण प्रेस के लिए वितरित करेगा। स्रोत: http://developer.android.com/reference/android/text/method/KeyListener.html –