Je veux créer TextInputLayout avec le style Widget.MaterialComponents.TextInputLayout.OutlinedBox. J'ai essayé beaucoup de façons mais je n'ai pas pu obtenir le résultat requis. Voici mon code.
TextInputLayout textInputLayout = new TextInputLayout(getActivity(),null,R.style.Widget_MaterialComponents_TextInputLayout_OutlinedBox);
textInputLayout.setHint("My Hint");
TextInputEditText editText = new TextInputEditText(textInputLayout.getContext());
textInputLayout.addView(editText);
parentView.addView(textInputLayout);
J'ai aussi essayé:
TextInputLayout textInputLayout = new TextInputLayout(getActivity(),null,TextInputLayout.BOX_BACKGROUND_OUTLINE);
METTRE À JOUR
Merci à Mike M.
Vous devez utiliser la méthode TextInputLayout.setBoxBackgroundMode()
pour utiliser le style OutlineBox.
setBoxBackgroundMode (int boxBackgroundMode)
Ensuite, vous devez utiliser TextInputLayout.BOX_BACKGROUND_OUTLINE)
Constants
NOTE: Pour obtenir le coin dans votre OutlineBox de TextInputLayout, vous devez utiliser
setBoxCornerRadii()
method
SAMPLE CODE
public class MainActivity extends AppCompatActivity {
LinearLayout parentView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
parentView = findViewById(R.id.parentView);
TextInputLayout emailTextInputLayout = new TextInputLayout(this, null, R.style.Widget_MaterialComponents_TextInputLayout_OutlinedBox);
emailTextInputLayout.setHint("Please Enter Email Address");
emailTextInputLayout.setBoxBackgroundMode(TextInputLayout.BOX_BACKGROUND_OUTLINE);
emailTextInputLayout.setBoxCornerRadii(5, 5, 5, 5);
TextInputEditText edtEmail = new TextInputEditText(emailTextInputLayout.getContext());
emailTextInputLayout.addView(edtEmail);
parentView.addView(emailTextInputLayout);
TextInputLayout passTextInputLayout = new TextInputLayout(this, null, R.style.Widget_MaterialComponents_TextInputLayout_OutlinedBox);
passTextInputLayout.setHint("Please Enter Password");
passTextInputLayout.setBoxBackgroundMode(TextInputLayout.BOX_BACKGROUND_OUTLINE);
passTextInputLayout.setBoxCornerRadii(5, 5, 5, 5);
TextInputEditText edtPass = new TextInputEditText(passTextInputLayout.getContext());
passTextInputLayout.addView(edtPass);
parentView.addView(passTextInputLayout);
}
}
SORTIE
Basé sur cette réponse: https://stackoverflow.com/questions/3246447/how-to-set-the-style-attrib--programmatically-in-Android} _
C'est la raison pour laquelle TextInputLayout
n'accepte pas par programmation de définir le style de contour.
Voici la solution simple:
Vous pouvez utiliser LayoutInflater
XML
dans ses objets View
correspondants.DÉMO
Créer une nouvelle mise en page
<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.TextInputLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/userIDTextInputLayout"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_margin="10dp">
<Android.support.design.widget.TextInputEditText
Android:id="@+id/userIDTextInputEditText"
Android:layout_width="match_parent"
Android:hint="Enter User Name"
Android:layout_height="wrap_content" />
</Android.support.design.widget.TextInputLayout>
AndroidX (+ Composants matériels pour Android ):
<?xml version="1.0" encoding="utf-8"?>
<com.google.Android.material.textfield.TextInputLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/userIDTextInputLayout"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_margin="10dp">
<com.google.Android.material.textfield.TextInputEditText
Android:id="@+id/userIDTextInputEditText"
Android:layout_width="match_parent"
Android:hint="Enter User Name"
Android:layout_height="wrap_content" />
</com.google.Android.material.textfield.TextInputLayout>
Maintenant, en utilisant
LayoutInflater
, ajoutezTextInputLayout
dans la mise en page requise.
public class MainActivity extends AppCompatActivity {
LinearLayout rootView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rootView = findViewById(R.id.rootView);
View view = LayoutInflater.from(this).inflate(R.layout.temp_layout, null);
TextInputLayout userNameIDTextInputLayout=view.findViewById(R.id.userIDTextInputLayout);
TextInputEditText userNameInputEditText = view.findViewById(R.id.userIDTextInputEditText);
userNameIDTextInputLayout.setHint("Please Enter User Name");
rootView.addView(view);
}
}
SORTIE
Si vous souhaitez ajouter un TextInputLayout
à partir de XML, veuillez vérifier la réponse suivante:
Si vous souhaitez ajouter plus de 5 TextInputLayout
par programme, envisagez d'utiliser un RecyclerView
. Découvrez les réponses suivantes:
J'espère que cela t'aides!
Vous pouvez utiliser la méthode applyStyle
définie sur la classe Theme
. Dans Kotlin, vous pouvez y accéder avec la propriété theme
sur une instance Context
(ou une sous-classe).
La fonction applyStyle
vous permet d'ajouter un style au thème actuel, qui définit les styles de référence des attributs de thème. Après avoir appelé cette méthode, vous pouvez passer l'attribut en tant que troisième paramètre d'une View
, comme TextInputLayout
, qui appliquera les styles souhaités tout en respectant le thème.
J'ai utilisé cette technique dans Splitties (une bibliothèque dont je suis l'auteur), et il existe une documentation ainsi que des exemples qui devraient vous aider: https://github.com/LouisCAD/Splitties/blob/v3.0.0-alpha02/views-dsl /README.md#using-styles-defined-in-xml
Je n'ai pas encore ajouté de support de première classe pour les thèmes de Material Components dans Splitties Views DSL, mais vous pouvez le faire vous-même et vous pouvez même ouvrir un problème pour en discuter ou contribuer à son intégration plus rapidement.