11

を呼び出すときにエラーEditTextのエラーインジケータの位置に問題があります。EditText setErrorがBottomSheetDialog内で外れています

スクリーンショットからわかるように、BottomSheetDialogにはEditTextを使用しています。エラーインジケータを表示すると、テキストは完全にはずれてしまいます。それは実際にはないのですが、ダイアログがフルスクリーンであると「考えている」ように見えます。

enter image description here

これは私のダイアログレイアウトファイル(phone_dialog.xml)である:これは私が示した方法です

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/rvContacts" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 
</LinearLayout> 

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
              xmlns:app="http://schemas.android.com/apk/res-auto" 
              android:layout_width="match_parent" 
              android:layout_height="wrap_content" 
              android:layout_weight="0" 
              android:orientation="vertical"> 

    <TextView 
     android:id="@+id/tvTitle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="8dp" 
     android:gravity="center" 
     android:padding="@dimen/padding_layout_normal" 
     android:text="@string/dialog_title_edit_phone" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     /> 

    <EditText 
     android:id="@+id/etPhone" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="8dp" 
     android:gravity="center" 
     android:inputType="phone" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toBottomOf="@+id/tvTitle"/> 


    <Button 
     android:id="@+id/btnSavePhone" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="0dp" 
     android:layout_marginRight="0dp" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toBottomOf="@+id/etPhone"/> 

</android.support.constraint.ConstraintLayout> 

マイActivityレイアウトファイル(activity_contacts.xml)私からのダイアログActivity

PhoneBottomDialog dialog = new PhoneBottomDialog(Context); 
dialog.show(); 

これは私のPhoneBottomDialogクラスである:私は私のカスタムPhoneButtomDialog内の他のレイアウト機能を実行していないのです

public class PhoneBottomDialog extends BottomSheetDialog { 

    public PhoneBottomDialog(Context context) { 
     super(context); 

     View view = getLayoutInflater().inflate(R.layout.phone_dialog, null); 
     setContentView(view); 

     // additional setup below this... 
    } 

    // ... 
} 

。ダイアログのルートレイアウトをRelativeLayoutまたはLinearLayoutに変更すると、ScrollViewを追加しても何も変更されませんでした。 Android 5.0から7.1までのすべてのテストデバイスで問題が発生するため、デバイスや特定のAndroidバージョンに関連する問題でもなく、エミュレータでも発生します。

これはなぜ起こっているのでしょうか?

+0

他のルートレイアウトを試してみてください代わりに<提案のためのandroid.support.constraint.ConstraintLayout – akhilesh0707

+0

おかげで、ちょうど 'RelativeLayout'、残念ながら同じ問題でそれを試してみました。 –

+0

TextInputLayout内で編集テキストを折り返してください –

答えて

6

あなたはEdit Textを定義することができますTextInputLayoutと内部を使用することができます。

私はあなたのphone_dialog.xmlの内部にいくつかの修正を行っています。 style.xmlインサイド

phone_dialog.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 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" 
    android:id="@+id/bottom_sheet" 
    android:layout_width="match_parent" 
    android:layout_height="300dp" 
    android:layout_gravity="bottom" 
    android:background="@android:color/holo_blue_light" 
    android:padding="10dp" 
    app:behavior_hideable="true" 
    app:behavior_peekHeight="60dp" 
    app:layout_behavior="android.support.design.widget.BottomSheetBehavior"> 


    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/tvTitle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:layout_marginTop="8dp" 
      android:gravity="center" 
      android:padding="10dp" 
      android:text="dialog_title_edit_phone" /> 

     <android.support.design.widget.TextInputLayout 
      android:id="@+id/inputPhone" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:theme="@style/TextInputLayoutLabel"> 

      <EditText 
       android:id="@+id/etPhone" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:hint="Enter phone" 
       android:imeOptions="actionDone" 
       android:inputType="phone" 
       android:maxLines="1" 
       android:textSize="20sp" /> 

     </android.support.design.widget.TextInputLayout> 


     <Button 
      android:id="@+id/btnSavePhone" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/etPhone" 
      android:layout_marginLeft="10dp" 
      android:layout_marginRight="10dp" 
      android:layout_marginTop="8dp" 
      android:text="Save" /> 

    </LinearLayout> 

</FrameLayout> 

これを追加します。

<style name="TextInputLayoutLabel" parent="Widget.Design.TextInputLayout"> 
     <!-- Hint color and label color in FALSE state --> 
     <item name="android:textColorHint">@android:color/black</item> 
     <item name="android:textSize">15sp</item> 
     <!-- Label color in TRUE state and bar color FALSE and TRUE State --> 
     <item name="colorAccent">@color/colorPrimary</item> 
     <item name="colorControlNormal">@color/colorAccent</item> 
     <item name="colorControlActivated">@color/colorAccent</item> 
    </style> 

PhoneBottomDialog.java

public class PhoneBottomDialog extends BottomSheetDialog { 

    TextInputLayout inputPhone; 
    EditText edtPhone; 
    Button btnSave; 

    public PhoneBottomDialog(Context context) { 
     super(context); 

     View view = getLayoutInflater().inflate(R.layout.phone_dialog, null); 
     setContentView(view); 

     // additional setup below this... 

     inputPhone = (TextInputLayout) view.findViewById(R.id.inputPhone); 

     edtPhone = (EditText) view.findViewById(R.id.etPhone); 
     btnSave = (Button) view.findViewById(R.id.btnSavePhone); 

     btnSave.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (!validatePhone()) 
        return; 
      } 
     }); 

    } 

    private boolean validatePhone() { 
     if (edtPhone.getText().toString().isEmpty()) { 
      inputPhone.setError("Please enter valid phone number with country code."); 
      requestFocus(edtPhone); 
      return false; 
     } else { 
      inputPhone.setErrorEnabled(false); 
     } 
     return true; 
    } 

    private void requestFocus(View view) { 
     if (view.requestFocus()) { 
      getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 
     } 
    } 

    // ... 
} 

内側Activity

@SuppressLint("SetTextI18n") 
    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.test24); 
     mContext = this; 

     this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 

     PhoneBottomDialog dialog = new PhoneBottomDialog(mContext); 
     dialog.show(); 
} 

以下の出力が表示されます。

enter image description here

+0

私はTILと一緒に働きました。まだEditText.setError(...)がBottomSheetDialogでこのような問題を抱えているのは不思議です。 –

+0

@PhilippJahoda私はまたSir。私は 'Edit Text'でテストしていましたが、最初にボタンを押している間は正確な位置にエラーが表示されていました。しかし、もう一度送信ボタンを押すと、シナリオはあなたのものと同じになります。 –

1

Lollipop(5.0)バージョンから、アンドロイドはこれを行うためにTextInputLayoutを提供しています。 同じタイプのビューを表示するには、xmlとjavaコードの下で使用してください。

abc.xml:

<android.support.design.widget.TextInputLayout 
       android:id="@+id/text_input_layout_user" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:gravity="center_vertical" 
       app:theme="@style/AppTheme"> 

       <android.support.v7.widget.AppCompatEditText 
        android:id="@+id/et_username" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:hint="Username" 
        android:imeOptions="actionNext" 
        android:inputType="text" 
        android:singleLine="true" 
        android:textColor="@color/icons" 
        android:textSize="16sp" /> 
      </android.support.design.widget.TextInputLayout> 

Abc.java:

private TextInputLayout 
textInputLayout_User = (TextInputLayout) findViewById(R.id.text_input_layout_user); 
textInputLayout_User.setError(getString(R.string.valid_username)); 
+0

あなたの答えにはより良いフォーマットを与えてください。コードだけを投稿しないでください –

1

xmlTextInputLayoutを使用

Gradleの依存関係に compile 'com.android.support:design:24.2.0'を追加します。

<android.support.design.widget.TextInputLayout 
    android:id="@+id/textInputServer" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="8dp" 
    android:layout_marginBottom="36dp" 
    app:errorTextAppearance="@style/TextErrorAppearance"> 
    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     ........./> 
</android.support.design.widget.TextInputLayout> 
関連する問題