Ripple Drawable, созданный с использованием сбоев Java на предварительном леденце

Я не использую файл XML для установки состояния рисуемой ряби, вместо этого я использую конструктор java new RippleDrawable(color, backgroundDrawable, null) , поскольку я использую его в адаптере, где каждый элемент имеет свой цвет. Код работает, как и ожидалось, на устройствах после леденца, но он вылетает со следующей ошибкой на устройствах до леденца, хотя я добавил проверку SDK_INT.

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        holder.rootView.setBackground(getBackgroundDrawable(ColorConverter.lightenColor(Color.parseColor(item.getTextColor()), 0.6f), background));
    }

получить фоновый рисунок ()

 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private static RippleDrawable getBackgroundDrawable(int pressedColor, Drawable backgroundDrawable) {
    return new RippleDrawable(getPressedState(pressedColor), backgroundDrawable, null);
}

получитьпресседстате()

 private static ColorStateList getPressedState(int pressedColor) {
    return new ColorStateList(new int[][]{new int[]{}}, new int[]{pressedColor});
}

Трассировка стека ошибок

E/dalvikvm: Could not find class 'android.graphics.drawable.RippleDrawable', referenced from method com.test.app.adapter.util.DashboardButtonsAdapter.getBackgroundDrawable
12-11 18:40:07.745 14717-14717/com.test.app E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.test.app, PID: 14717
java.lang.VerifyError: com/test/app/adapter/util/DashboardButtonsAdapter
    at com.test.app.fragment.dashboard.DashboardPageFragment.onCreateView(DashboardPageFragment.java:71)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
    at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
    at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2243)
    at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:654)
    at androidx.fragment.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:168)
    at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
    at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
    at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)
    at android.view.View.measure(View.java:16504)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:733)
    at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:805)
    at android.view.View.measure(View.java:16504)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
    at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1052)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:590)
    at android.view.View.measure(View.java:16504)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
    at android.view.View.measure(View.java:16504)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
    at android.view.View.measure(View.java:16504)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
    at android.view.View.measure(View.java:16504)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    at android.view.View.measure(View.java:16504)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
    at android.view.View.measure(View.java:16504)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
    at android.view.View.measure(View.java:16504)
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912)
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRo
2
0
122
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Причина в том, что #getBackgroundDrawable возвращает RippleDrawable . Поскольку он доступен только 21+, следовательно, ошибка проверки, потому что его независимый метод и тип возвращаемого значения в сигнатуре метода не найден андроидом. Чтобы убедиться в этом, при запуске приведенного ниже кода вы не получите ту же ошибку, потому что существует проверка версии для всего блока кода.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        RippleDrawable rippleDrawable= new RippleDrawable(getPressedState(Color.GREEN), null, null);
        textView.setBackground(rippleDrawable);
    }

Самое простое решение вашей проблемы — изменить тип возвращаемого значения #getBackgroundDrawable на Drawable.

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private static Drawable getBackgroundDrawable(int pressedColor, Drawable backgroundDrawable) {
    return new RippleDrawable(getPressedState(pressedColor), backgroundDrawable, null);
}

java.lang.VerifyError означает, что ваш код относится к чему-то, что Android не может найти. Изменение типа возвращаемого значения на сигнатуру метода Drawable будет допустимо для API-19. Если вы запустите этот код без проверки версии, вы получите ClassNotFoundException, потому что теперь выполняется фактическое тело метода. Посмотрите В этой теме.

Как мы знаем, RippleDrawable() не поддерживается леденец ниже версии Android (ниже версии 21).

Итак, для версии до леденца, Для волнового эффекта вы можете попробовать это.

Эта библиотека Материал

dependencies { 
implementation 'com.github.rey5137:material:1.3.1'
 }
    

И это код вашей кнопки,

<com.rey.material.widget.Button 
   style = "@style/YourOwnStyle" 
   android:layout_width = "wrap_content" 
   android:layout_height = "wrap_content" 
   android:text = "BUTTON" 
  app:rd_style = "@style/YourRippleDrawableStyle"/>

Это также поддержка в пользовательском представлении,

Для более подробной проверки перейдите по этой ссылке,

https://github.com/rey5137/Material/wiki/Кнопка

Другие вопросы по теме