2016-05-06 7 views
7

मैं एक त्रुटि संदेश को सीधे android.support.design.widget.TextInputLayout पर जोड़ना चाहता हूं। मुझे लेआउट के माध्यम से त्रुटि सेट करने का कोई तरीका नहीं मिल रहा है। क्या यह भी संभव है? (जो थोड़ा अजीब जानने errorEnabled है)क्या मैं एक TextInputLayout में एक त्रुटि संदेश बांध सकता हूं?

<?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" 
    xmlns:tools="http://schemas.android.com/tools"> 
    <data> 
     <import type="android.view.View" /> 
     <variable 
      name="error" 
      type="String" /> 
    </data> 
    <android.support.v7.widget.LinearLayoutCompat 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <android.support.design.widget.TextInputLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:errorEnabled="true" 
      app:errorText="@{error}"> 
      <EditText 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:hint="@string/username" 
       android:inputType="textEmailAddress" /> 
     </android.support.design.widget.TextInputLayout> 
    </android.support.v7.widget.LinearLayoutCompat> 
</layout> 
+0

उपयोग पर पढ़ सकते हैं। गतिविधि से बाध्यकारी प्राप्त करें, जैसे: MainActivity बाइंडिंग बाध्यकारी = DataBindingUtil.setContentView (यह, R.layout.main_activity); और binding.setError ("स्ट्रिंग जो आप चाहते हैं" द्वारा मूल्य निर्धारित करें) –

+0

वास्तव में प्रश्न को संबोधित नहीं करते हैं। मुझे पता है कि बुनियादी बाध्यकारी पहले से ही कैसे करें। – Theyouthis

उत्तर

17

setError() विधि से संबंधित कोई XML विशेषता नहीं है, इसलिए आप XML में सीधे त्रुटि संदेश सेट नहीं कर सकता:

यह कैसे मैं यह काम कर रहा कल्पना की है। लेकिन इसे Binding Adapter बनाकर आसानी से हल किया जा सकता है जो आपके लिए सेट करेगा। ऐसा कुछ।

@BindingAdapter("app:errorText") 
public static void setErrorMessage(TextInputLayout view, String errorMessage) { 
    view.setError(errorMessage); 
} 

official binding docs, अनुभाग "गुण Setters" विशेष रूप से "कस्टम Setters"

संपादित

शायद गूंगा सवाल है, लेकिन जहां मैं इस रखना चाहिए देखें क्या मुझे TextInputLayout का विस्तार करने और इसे वहां रखने की आवश्यकता है?

यह वास्तव में एक बेवकूफ सवाल नहीं है, बस इसलिए कि आप आधिकारिक दस्तावेज़ीकरण को पढ़कर पूरा जवाब नहीं प्राप्त कर सकते हैं। सौभाग्य से यह बहुत आसान है: आपको कुछ भी विस्तार करने की आवश्यकता नहीं है - बस अपनी परियोजनाओं में कहीं भी डालें। आप अलग-अलग वर्ग (यानी BindingTools.java) बना सकते हैं या बस इस विधि को अपनी परियोजना में किसी मौजूदा कक्षा में जोड़ सकते हैं। जब तक आप @BindingAdapter साथ इस पद्धति पर टिप्पणी के रूप में, यह सुनिश्चित करें कि यह publicऔरstatic है यह कोई बात नहीं क्या वर्ग में वह जीता है।

+0

शायद बेवकूफ सवाल है, लेकिन मुझे यह कहां रखना चाहिए? क्या मुझे TextInputLayout का विस्तार करने और इसे वहां रखने की आवश्यकता है? – Theyouthis

+0

संपादित उत्तर देखें। –

+0

धन्यवाद आपके मार्गदर्शन के लिए महोदय। – Theyouthis

1

मैं बना दिया है How to set error on EditText using DataBinding Framwork MVVM पर मेरा उत्तर की तरह एक बाध्यकारी। लेकिन इस बार यह पिछले एक की तरह नमूना के रूप में TextInputLayout का उपयोग किया। इस विचार के

उद्देश्य:

  1. एक्सएमएल के रूप में के रूप में पठनीय संभव बनाने और स्वतंत्र
  2. गतिविधि-साइड सत्यापन व एक्सएमएल-साइड सत्यापन सुनिश्चित स्वतंत्र रूप से
बेशक

, आप कर सकते हैं आपको अपना सत्यापन बनाते हैं और इसे <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(); 

    }); 
    } 
} 
संबंधित मुद्दे