Выровняйте базовую линию с TextView, который обернут внутри TextInputLayout
Я хочу выровнять базовую линию TextView "Дефицит" с EditText "10000". Они оба внутри <android.support.percent.PercentRelativeLayout>
Я попробовал следующее, но не могу заставить его работать.
<android.support.percent.PercentRelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayout_soil_nitrogen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
app:layout_widthPercent="63%">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter N of soil"
tools:text="10000" />
</android.support.design.widget.TextInputLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/textInputLayout_soil_nitrogen"
android:layout_toRightOf="@id/textInputLayout_soil_nitrogen"
app:layout_widthPercent="37%"
tools:text="Deficient" />
</android.support.percent.PercentRelativeLayout>
Задание верхнего отступа 20dp для типа TextView делает свое дело, но было бы неплохо вместо этого выровнять их базовые линии. Это вообще возможно в этом случае?
Я удалил атрибуты textAppearance и id, кстати.
5 ответов
Старый вопрос, но вот мое решение.
По сути, TextInputLayout не предоставляет базовое значение для своего родителя. Нам нужно передать правильную базовую линию EditText
расширяя TextInputLayout
, Это работает для меня, однако, я не уверен, что базовая линия изменится из-за других событий из TextInputLayout
,
public class CTextInputLayout extends TextInputLayout {
public CTextInputLayout(Context context) {
super(context);
}
public CTextInputLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public int getBaseline()
{
EditText editText = getEditText();
return editText.getPaddingTop() + editText.getBaseline();
}
}
Я предполагаю, что PercentRelativeLayout
поддерживает базовое выравнивание. В противном случае вы можете обернуть CTextInputLayout
а также TextView
внутри RelativeLayout
для достижения базовой линии aligment.
Внутри TextInputLayout
, поместите RelativeLayout
с EditText
а также TextView
как дети:
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayout_soil_nitrogen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_widthPercent="63%">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/edittext_soil_nitrogen"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter N of soil"
android:text="10000" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/edittext_soil_nitrogen"
android:layout_alignParentRight="true"
android:layout_widthPercent="37%"
android:text="Deficient" />
</RelativeLayout>
</android.support.design.widget.TextInputLayout>`
Проверьте это изображение для проверки
Пожалуйста, попробуйте следующий код
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayout_soil_nitrogen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
app:layout_widthPercent="63%">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter N of soil"
tools:text="10000" />
</android.support.design.widget.TextInputLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/textInputLayout_soil_nitrogen"
android:layout_toEndOf="@id/textInputLayout_soil_nitrogen"
android:layout_toRightOf="@id/textInputLayout_soil_nitrogen"
android:gravity="bottom|start"
android:padding="8dp"
android:text="Deficient"
android:textColor="@android:color/black"
app:layout_widthPercent="37%" />
Пожалуйста, замените строку кода ниже
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/textInputLayout_soil_nitrogen"
android:layout_toRightOf="@id/textInputLayout_soil_nitrogen"
app:layout_widthPercent="37%"
tools:text="Deficient" />
к
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/textInputLayout_soil_nitrogen"
android:layout_toEndOf="@id/textInputLayout_soil_nitrogen"
android:layout_toRightOf="@id/textInputLayout_soil_nitrogen"
tools:text="Deficient" />
Надеюсь, это поможет вам!
Если вы используете Kotlin, я нашел решение, которое работает (вроде). Его программное решение.
Я использовал ConstraintLayout, чтобы обернуть представления
Предположим, textViewDeficient - это представление, выравниваемое по базовой линии макета TextInputLayout.
Так будет выглядеть мой макет
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/textInputLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/phone_number"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/textInputEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="100000"/>
</com.google.android.material.textfield.TextInputLayout>
<TextView
android:id="@+id/textViewDeficient"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@id/textInputLayout"
app:layout_constraintLeft_toRightOf="@id/textInputLayout"
app:layout_constraintTop_toTopOf="@id/textInputLayout"
android:text="Deficient"/>
</androidx.constraintlayout.widget.ConstraintLayout>
И в вашей деятельности есть этот метод
private fun adjustTextView() {
fun setTextViewTopMargin() {
textInputLayout?.post {
val frameLayout = textInputLayout?.children?.iterator()?.next()
if (frameLayout is FrameLayout) {
frameLayout.postIt { fl ->
textInputEditText?.postIt { tiet ->
val topMargin = fl.marginTop + tiet.marginTop + dpToPx(5)
textViewDeficient?.updateLayoutParams<ConstraintLayout.LayoutParams> {
updateMargins(top = topMargin)
}
}
}
}
}
}
textInputLayout?.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
setTextViewTopMargin()
}
setTextViewTopMargin()
}
Добавьте эти функции расширения в свою деятельность или любой файл
fun View.postIt(postAction: (v: View) -> Unit) { post { postAction.invoke(this) }}
fun Context.dpToPx(dp: Int) = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, dp.toFloat(), resources.displayMetrics
).toInt()
Сейчас звоните
adjustTextView()
в методе onCreate вашей активности
Надеюсь, это поможет. Сообщите мне, можно ли его улучшить