我正在尝试实现以下布局:固定宽度TextView对齐到其父级的左侧,其中的文本与TextView的右侧对齐(这就是固定宽度的原因,可以通过其他方式完成吗?)和父母的其余部分填充了一个drawable(简单的线).像这样:
它是一个包含2种类型行的ListView,带有行的行的布局非常简单 - 使用TextView和ImageView的LinearLayout(如果需要,我可以稍后发布确切的代码).而且我收到一个警告,它可以用一个带有复合drawable的TextView替换.
我都是为了优化,所以我真的试着遵循这个建议.遗憾的是我没能得到同样的结果 - 该行是约束到的TextView的宽度或文本对齐到列表项的右侧,现在固定的位置.
我错过了什么吗?
编辑:显然它实际上是不可能的,因为还有一些其他的复杂功能(drawable现在是一个水平列表drawable,它不总是一条线,有时它有一个我必须设置的非固定高度)我将离开它现在是 - 线性布局,包含一个TextView和一个ImageView.
我正在尝试在数据绑定中使用空合并运算符。我有一个复合可绘制对象,需要显示三个可绘制图标之一,具体取决于变量是 null、true 还是 false。
XML
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="android.view.View" />
<variable
name="dataModel"
type="com.my.app.MyDataModel" />
</data>
<TextView
android:id="@id/mCompoundDrawable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableRight="@{(dataModel.isSelected ? @drawable/selected : @drawable/not_selected) ?? @drawable/not_specified }"
android:focusable="true"
android:gravity="center_vertical"
android:scrollHorizontally="false"
android:text="@{dataModel.text}" />
</layout>
Run Code Online (Sandbox Code Playgroud)
数据模型
public class MyDataModel
{
public String text;
public Boolean isSelected;
public MyDataModel(String text, Boolean isSelected)
{
this.text = text;
this.isSelected = isSelected;
}
}
Run Code Online (Sandbox Code Playgroud)
我通过调用以下命令来调用它:
MyDataModel dataModel = new MyDataModel(text, null);
binding.setDataModel(dataModel);
Run Code Online (Sandbox Code Playgroud)
我以为
android:drawableRight="@{(dataModel.isSelected ? @drawable/selected : @drawable/not_selected) ?? @drawable/not_specified }
Run Code Online (Sandbox Code Playgroud)
实际上等同于: …
如何在下图中放置drawableLeft和按钮AppCompatButton类似的文本?
我试图申请paddingLeft,但文本正在远离可绘制的右侧。
<android.support.v7.widget.AppCompatButton
android:id="@+id/filterBy"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawableLeft="@drawable/ic_btn_filter"
android:paddingLeft="20dp"
android:text="@string/filter_by"
android:textAllCaps="false" />
Run Code Online (Sandbox Code Playgroud)
到目前为止,结果看起来像
布局
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/profileHeader"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="10dp">
<android.support.v7.widget.AppCompatButton
android:id="@+id/findFriends"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawableLeft="@drawable/ic_btn_search"
android:text="@string/find_friends"
android:textAllCaps="false" />
<android.support.v7.widget.AppCompatButton
android:id="@+id/filterBy"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawableLeft="@drawable/ic_btn_filter"
android:text="@string/filter_by"
android:textAllCaps="false" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
以及使事情变得清晰的解释性要求。
使用
layout_weight属性 am 调整两个按钮的宽度,我必须做的是,文本应该在按钮的中心,drawable 应该在文本的左侧附近对齐。
请问有什么建议吗?
在我的活动应用程序,我想设置EditText为我点击里面(焦点)的EditText和类型清除的关键button 应该出现在右侧的EditText
当EditText上为空时清除按钮都去掉.
但它没有向我展示..
我应该在这里实施哪个事件..?onTouch或者onFocusChange或者addTextChangedListener还有什么代码......?以下代码我在活动中完成了......
在活动中:
clear = getResources().getDrawable(R.drawable.round_clear);
clear.setBounds(0, 0, clear.getIntrinsicWidth(), clear.getIntrinsicHeight());
Run Code Online (Sandbox Code Playgroud)
和事件
@Override
public void onFocusChange(View v, boolean hasFocus)
{
switch (v.getId())
{
case R.id.uIDEditText:
if(hasFocus && !uIDEditText.getText().toString().isEmpty())
uIDEditText.setCompoundDrawables(null, null, clear, null);
else
uIDEditText.setCompoundDrawables(null, null, null, null);
break;
case R.id.pwdEditText:
if(hasFocus && !pwdEditText.getText().toString().isEmpty())
pwdEditText.setCompoundDrawables(null, null, clear, null);
else
pwdEditText.setCompoundDrawables(null, null, null, null);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
另一个事件是:
@Override
public boolean onTouch(View v, MotionEvent event)
{
switch (v.getId())
{ …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
etEmail.setOnTouchListener((view, motionEvent) -> {
final int DRAWABLE_RIGHT = 2;
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
if(motionEvent.getRawX() >= (etEmail.getRight() - etEmail.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {
Utils.getInstance().showPopup("...",MainActivity.this,null);
return true;
}
}
return false;
});
Run Code Online (Sandbox Code Playgroud)
虽然通常它似乎有效,但我突然收到一份崩溃报告说:
尝试在空对象引用上调用虚拟方法“android.graphics.Rect android.graphics.drawable.Drawable.getBounds()”
适用品牌:小米,型号:Redmi Note 6 Pro,Android:9。
这里有人知道什么会导致可绘制对象“消失”或被视为空吗?
XML 布局:
<EditText
android:id="@+id/etEmail"
tools:ignore="Autofill"
android:inputType="textEmailAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableEnd="@drawable/ic_info"
android:paddingEnd="12dp"
android:paddingStart="10dp"
android:textAppearance="@style/TextAppearance.AppCompat.Medium" />
Run Code Online (Sandbox Code Playgroud)