मैं बना दिया है How to set error on EditText using DataBinding Framwork MVVM पर मेरा उत्तर की तरह एक बाध्यकारी। लेकिन इस बार यह पिछले एक की तरह नमूना के रूप में TextInputLayout का उपयोग किया। इस विचार के
उद्देश्य:
- एक्सएमएल के रूप में के रूप में पठनीय संभव बनाने और स्वतंत्र
- गतिविधि-साइड सत्यापन व एक्सएमएल-साइड सत्यापन सुनिश्चित स्वतंत्र रूप से
बेशक
, आप कर सकते हैं आपको अपना सत्यापन बनाते हैं और इसे <variable>
टैग का उपयोग xml
पहले, स्थैतिक लागू करता है तैयारी के लिए बाध्यकारी विधि और संबंधित स्ट्रिंग सत्यापन नियम।
बाइंडिंग
@BindingAdapter({"app:validation", "app:errorMsg"})
public static void setErrorEnable(TextInputLayout textInputLayout, StringRule stringRule,
final String errorMsg) {
}
StringRule
public static class Rule {
public static StringRule NOT_EMPTY_RULE = s -> TextUtils.isEmpty(s.toString());
public static StringRule EMAIL_RULE = s -> s.toString().length() > 18;
}
public interface StringRule {
boolean validate(Editable s);
}
दूसरा, TextInputLayout में डिफ़ॉल्ट सत्यापन और त्रुटि संदेश डाल दिया और यह आसान सत्यापन पता करने के लिए बनाने के लिए, एक्सएमएल में बाध्यकारी
<android.support.design.widget.TextInputLayout
android:id="@+id/imageUrlValidation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:validation="@{Rule.NOT_EMPTY_RULE}"
app:errorMsg='@{"Cannot be empty"}'
>
<android.support.design.widget.TextInputEditText
android:id="@+id/input_imageUrl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Image Url"
android:text="@={feedEntry.imageUrl}" />
</android.support.design.widget.TextInputLayout>
तीसरा, जब क्लिक बटन ट्रिगर होता है, तो आप TextInputLayout (उदा। imageUrlValidation) गतिविधि पर अंतिम मान्यकरण करना
Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
button.setOnClickListener(view1 -> {
// TODO Do something
//to trigger auto error enable
FeedEntry inputFeedEntry = dialogFeedEntryBinding.getFeedEntry();
Boolean[] validations = new Boolean[]{
dialogFeedEntryBinding.imageUrlValidation.isErrorEnabled(),
dialogFeedEntryBinding.titleValidation.isErrorEnabled(),
dialogFeedEntryBinding.subTitleValidation.isErrorEnabled()
};
boolean isValid = true;
for (Boolean validation : validations) {
if (validation) {
isValid = false;
}
}
if (isValid) {
new AsyncTask<FeedEntry, Void, Void>() {
@Override
protected Void doInBackground(FeedEntry... feedEntries) {
viewModel.insert(feedEntries);
return null;
}
}.execute(inputFeedEntry);
dialogInterface.dismiss();
}
});
पूरा कोड पीछा कर रहा है:
dialog_feedentry.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="com.example.common.components.TextInputEditTextBindingUtil.Rule" />
<variable
name="feedEntry"
type="com.example.feedentry.repository.bean.FeedEntry" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
android:orientation="vertical">
<android.support.design.widget.TextInputLayout
android:id="@+id/imageUrlValidation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:validation="@{Rule.NOT_EMPTY_RULE}"
app:errorMsg='@{"Cannot be empty"}'
>
<android.support.design.widget.TextInputEditText
android:id="@+id/input_imageUrl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Image Url"
android:text="@={feedEntry.imageUrl}" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/titleValidation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:validation="@{Rule.NOT_EMPTY_RULE}"
app:errorMsg='@{"Cannot be empty"}'
>
<android.support.design.widget.TextInputEditText
android:id="@+id/input_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Title"
android:text="@={feedEntry.title}"
/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/subTitleValidation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:validation="@{Rule.NOT_EMPTY_RULE}"
app:errorMsg='@{"Cannot be empty"}'
>
<android.support.design.widget.TextInputEditText
android:id="@+id/input_subtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Subtitle"
android:text="@={feedEntry.subTitle}"
/>
</android.support.design.widget.TextInputLayout>
</LinearLayout>
</layout>
TextInputEditTextBindingUtil.java
package com.example.common.components;
import android.databinding.BindingAdapter;
import android.support.design.widget.TextInputLayout;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
/**
* Created by Charles Ng on 7/9/2017.
*/
public class TextInputEditTextBindingUtil {
@BindingAdapter({"app:validation", "app:errorMsg"})
public static void setErrorEnable(TextInputLayout textInputLayout, StringRule stringRule,
final String errorMsg) {
textInputLayout.getEditText().addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
textInputLayout
.setErrorEnabled(stringRule.validate(textInputLayout.getEditText().getText()));
if (stringRule.validate(textInputLayout.getEditText().getText())) {
textInputLayout.setError(errorMsg);
} else {
textInputLayout.setError(null);
}
}
});
textInputLayout
.setErrorEnabled(stringRule.validate(textInputLayout.getEditText().getText()));
if (stringRule.validate(textInputLayout.getEditText().getText())) {
textInputLayout.setError(errorMsg);
} else {
textInputLayout.setError(null);
}
}
public static class Rule {
public static StringRule NOT_EMPTY_RULE = s -> TextUtils.isEmpty(s.toString());
public static StringRule EMAIL_RULE = s -> s.toString().length() > 18;
}
public interface StringRule {
boolean validate(Editable s);
}
}
http://developer.android.com/intl/vi/tools/data-binding/guide.html: 210
FeedActivity.java
public class FeedActivity extends AppCompatActivity {
private FeedEntryListViewModel viewModel;
@SuppressLint("StaticFieldLeak")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_feed);
viewModel = ViewModelProviders.of(this)
.get(FeedEntryListViewModel.class);
viewModel.init(this);
ViewPager viewPager = findViewById(R.id.viewpager);
setupViewPager(viewPager);
// Set Tabs inside Toolbar
TabLayout tabs = findViewById(R.id.tabs);
tabs.setupWithViewPager(viewPager);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(view -> {
//insert sample data by button click
final DialogFeedentryBinding dialogFeedEntryBinding = DataBindingUtil
.inflate(LayoutInflater.from(this), R.layout.dialog_feedentry, null, false);
FeedEntry feedEntry = new FeedEntry("", "");
feedEntry.setImageUrl("http://i.imgur.com/DvpvklR.png");
dialogFeedEntryBinding.setFeedEntry(feedEntry);
final Dialog dialog = new AlertDialog.Builder(FeedActivity.this)
.setTitle("Create a new Feed Entry")
.setView(dialogFeedEntryBinding.getRoot())
.setPositiveButton("Submit", null)
.setNegativeButton("Cancel", (dialogInterface, i) -> dialogInterface.dismiss())
.create();
dialog.setOnShowListener(dialogInterface -> {
Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
button.setOnClickListener(view1 -> {
// TODO Do something
//to trigger auto error enable
FeedEntry inputFeedEntry = dialogFeedEntryBinding.getFeedEntry();
Boolean[] validations = new Boolean[]{
dialogFeedEntryBinding.imageUrlValidation.isErrorEnabled(),
dialogFeedEntryBinding.titleValidation.isErrorEnabled(),
dialogFeedEntryBinding.subTitleValidation.isErrorEnabled()
};
boolean isValid = true;
for (Boolean validation : validations) {
if (validation) {
isValid = false;
}
}
if (isValid) {
new AsyncTask<FeedEntry, Void, Void>() {
@Override
protected Void doInBackground(FeedEntry... feedEntries) {
viewModel.insert(feedEntries);
return null;
}
}.execute(inputFeedEntry);
dialogInterface.dismiss();
}
});
});
dialog.show();
});
}
}
उपयोग पर पढ़ सकते हैं। गतिविधि से बाध्यकारी प्राप्त करें, जैसे: MainActivity बाइंडिंग बाध्यकारी = DataBindingUtil.setContentView (यह, R.layout.main_activity); और binding.setError ("स्ट्रिंग जो आप चाहते हैं" द्वारा मूल्य निर्धारित करें) –
वास्तव में प्रश्न को संबोधित नहीं करते हैं। मुझे पता है कि बुनियादी बाध्यकारी पहले से ही कैसे करें। – Theyouthis