#android
#Android
Вопрос:
Я создавал пользовательский вид. Итак, мне нужно установить dp или wrap_content(match_parent). Но я обнаружил, что не могу установить dp и wrap_content вместе. Есть ли какой-нибудь способ установить их вместе? Я пробовал этот способ, но не работает. когда я устанавливаю app:buttonWidth="100dp"
, он работает, но не работает, когда app:buttonWidth="wrap_content"
xml
<com.example.custom.ButtonLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:buttonWidth="100dp"
app:buttonHeight="100dp"/>
attr
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ButtonStyle">
<attr name="buttonWidth" format="dimension|integer">
<enum name="match_parent" value="-1"/>
<enum name="wrap_content" value="-2"/>
</attr>
<attr name="buttonHeight" format="dimension|integer">
<enum name="match_parent" value="-1"/>
<enum name="wrap_content" value="-2"/>
</attr>
</declare-styleable>
</resources>
Класс CustomView
init{
LayoutInflater.from(context).inflate(R.layout.button_layout, this, true)
attrs?.apply {
val typedArray =
context.obtainStyledAttributes(attrs, R.styleable.ButtonStyle, defStyle, 0)
buttonWidth = typedArray.getDimensionPixelSize(R.styleable.ButtonStyle_buttonWidth,
ViewGroup.LayoutParams.WRAP_CONTENT)
buttonHeight = typedArray.getDimensionPixelSize(R.styleable.ButtonStyle_buttonHeight,
ViewGroup.LayoutParams.WRAP_CONTENT)
typedArray.recycle()
}
}
Комментарии:
1. зачем вам это нужно? почему бы не установить минимальную ширину?
2. Я не понимаю вашего комментария. Я хочу установить wrap_content . 100dp работает, но wrap_content не работает.
3. вы можете установить wrap_content в xml для своего макета (кнопка или что-то еще), а также установить минимальную ширину 100dp для того же макета
4.
buttonWidth = typedArray.getDimensionPixelSize(R.styleable.ButtonStyle_buttonWidth, ViewGroup.LayoutParams.WRAP_CONTENT)
это не работает, когда я устанавливаю wrap_content . Вы понимаете мой вопрос?
Ответ №1:
Сначала не понял, что вы хотите, позвольте мне показать вам некоторый код:
public FooterBar(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.FooterBar, 0, 0);
String btnSavetitle = a.getString(R.styleable.FooterBar_saveButtonText);
boolean cameraVisible = a.getBoolean(R.styleable.FooterBar_secondButtonVisible, false);
int secondIconButton = a.getResourceId(R.styleable.FooterBar_secondIconButton, R.drawable.ic_baseline_wallpaper_48);
int width = a.getLayoutDimension(R.styleable.FooterBar_widthSize, -2);
setOrientation(LinearLayout.VERTICAL);
setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.form_footer_bar, this, true);
btnSave = findViewById(R.id.footer_bar_save);
ivSecondButton = findViewById(R.id.footer_bar_second_button);
setSecondIconButton(secondIconButton);
if (width > 0) {
ivSecondButton.getLayoutParams().width = width;
}
btnSave.setText(btnSavetitle);
ivSecondButton.setVisibility(cameraVisible ? ImageView.VISIBLE : ImageView.GONE);
a.recycle();
}
Основная идея состоит в том, чтобы передать значение из TypedArray в объект button, который вы определили в своем пользовательском классе view, с помощью setWidth() . -2 для содержимого переноса
Редактировать:
в attr.xml:
<attr name="widthSize" format="dimension">
<enum name="fill_parent" value="-1" />
<enum name="match_parent" value="-1" />
<enum name="wrap_content" value="-2" />
</attr>
в пользовательском коде просмотра все, что я делаю:
if (width > 0) { ivSecondButton.getLayoutParams().width = width; }
в layout xml:
<com.mobnius.core.ui.component.FooterBar
android:id="@ id/form_footer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:widthSize="wrap_content" //or 50dp for example
app:layout_constraintBottom_toBottomOf="parent"
app:saveButtonText="@string/save"
app:secondButtonVisible="true"
app:secondIconButton="@drawable/ic_baseline_wallpaper_48" />
Комментарии:
1. ваш ответ не соответствует моей проблеме. Я знаю, что значение wrap_content равно -2, а match_parent равно -1. Итак, я добавил это в attr.xml как вы можете видеть. ошибка возникает в
buttonWidth = typedArray.getDimensionPixelSize(R.styleable.ButtonStyle_buttonWidth, ViewGroup.LayoutParams.WRAP_CONTENT)
2. послушайте, я вижу, что вы не определяете свою кнопку и не передаете buttonWidth как button.setWidth(buttonWidth)
3. моя кнопка определена под моим кодом инициализации. buttonWidth адаптируется к кнопке, подобной этой `button.measure(ViewGroup. LayoutParams. WRAP_CONTENT, ViewGroup . LayoutParams. WRAP_CONTENT) `
4. Я думаю, что метод измерения — это не то, что вам нужно, чтобы установить ширину кнопки на wrap_content
5. пожалуйста, попробуйте этот код
buttonWidth = typedArray.getDimensionPixelSize(R.styleable.ButtonStyle_buttonWidth, ViewGroup.LayoutParams.WRAP_CONTENT)
и<attr name="buttonHeight" format="dimension|integer"> <enum name="match_parent" value="-1"/> <enum name="wrap_content" value="-2"/> </attr>
в вашем проекте. сейчас вы не понимаете мой вопрос