как адаптировать измерение с целым числом при настройке атрибутов в Android?

#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> в вашем проекте. сейчас вы не понимаете мой вопрос