Вложенный ScrollView не может быть приведен к android.support.constraint.ConstraintLayout

#java #android #android-layout

#java #Android #android-layout

Вопрос:

У меня есть ConstraintLayout внутри ScrollView. Я пытаюсь использовать анимацию ConstraintLayout. Он отлично работает вне ScrollView, но когда я хочу использовать его внутри ScrollView, AndroidStudio говорит:

 android.support.v4.widget.NestedScrollView cannot be cast to android.support.constraint.ConstraintLayout
  

Я знаю это, потому что мой корневой макет — ScrollView, но я не знаю, как это исправить.

Я попытался добавить другой ConstraintLayout перед ScrollView, на этот раз приложение работало без сбоев, но когда я нажимаю кнопку, ничего не происходит.

 <android.support.v4.widget.NestedScrollView 
android:id="@ id/scrollView2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">

<android.support.constraint.ConstraintLayout
    android:id="@ id/const1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/background_light"
    tools:context=".MainActivity">
  

Это то, что я сделал в MainActivity

 ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(this, R.layout.activity_main_animation);
ChangeBounds transition = new ChangeBounds();
transition.setInterpolator(new AnticipateInterpolator(1.0f));
transition.setDuration(1200);
TransitionManager.beginDelayedTransition(cc1, transition);
constraintSet.applyTo(cc1);
  

Комментарии:

1. Можете ли вы показать свое объявление для cc1?

2. Я также полагаю, что вы пытаетесь клонировать ограничения для всего вашего макета, но NestedScrollView не имеет ограничений. Вам нужно клонировать ограничения для cc1 (если это ваше ConstraintLayout) не для всего макета.

3. ^ В принципе, это. clone(Context, int) Метод предполагает, что корнем View в предоставленном макете является ConstraintLayout .

4. @brandonx Да. вот оно: ConstraintLayout cc1= findViewById(R.id.inputUser);

5. Попробуйте клонировать cc1 без параметра context, а не весь ваш макет. Я также не вижу, чтобы вы меняли что-либо, что могло бы вызвать переход с ограничениями изменений. Чего вы пытаетесь достичь?

Ответ №1:

Измените приведенный ниже код

 ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(this, R.layout.activity_main_animation); //this line need to be changed to 
constraintSet.clone(this, const1);// Pass id of ConstraintLayout for cloning as root layout of your xml file is not a ConstraintLayout.
  

Комментарии:

1. я сделал это раньше, но не работает. Мне пришлось удалить ScrollView. К счастью, все еще прокручивается.

2. Или же вы можете добавить ConstraintLayout в качестве родительского средства ScrollView в качестве корневого представления

Ответ №2:

Вот что вы могли бы попробовать, если вы не возражаете анимировать все изменения макета в своих представлениях. Это достаточно легко добавить и посмотреть, работает ли это для вашего варианта использования. Добавить:

     android:animateLayoutChanges="true"
  

в ваш NestedScrollView и отключите все ваши переходы. Каждый раз, когда вы меняете границы представления или добавляете что-то новое на экран или за его пределы, Android автоматически обрабатывает анимации. Опять YMMV, поскольку вы не можете контролировать скорость анимации и т.д., Но попробовать стоит.