0

J'essaie d'implémenter une classe personnalisée qui implémente ConstraintLayout, mais le problème est que lorsque j'essaie d'utiliser cela en XML, le Studio Android se bloque, tout se fige, vous pouvez ' Pour faire quoi que ce soit, vous pouvez simplement fermer le Studio via le Gestionnaire des tâches. Ensuite, vous rouvrez, mais si vous ouvrez ce fichier XML, c'est la même histoire à nouveau.Classe personnalisée avec mise en page contrainte, Android Studio HANGS

J'ai obtenu ceci: L'aperçu a expiré lors du rendu de la mise en page. Cela se produit généralement lorsqu'il existe une boucle infinie ou une récursivité illimitée dans l'une des vues personnalisées.

Fondamentalement, j'ai d'abord conçu l'interface utilisateur à travers ConstraintLayout, puis j'ai essayé de remplacer ConstraintLayout avec cette classe, puis quand il essaie de le rendre se fige. Je ne peux pas donner beaucoup de code à cause de la NDA.

Classe:

public class ExtraView extends ConstraintLayout { 

     public ExtraView(Context context) { 
      super(context); 
      init(context); 
     } 

     public ExtraView (Context context, AttributeSet attrs) { 
      super(context, attrs); 
      init(context); 
     } 

     public ExtraView (Context context, AttributeSet attrs, int defStyleAttr) { 
      super(context, attrs, defStyleAttr); 
      init(context); 
     } 

     public void init(Context context){ 
      View v = LayoutInflater.from(context).inflate(R.layout.view_extra_rent_booking, this, true); 
      Butterknife.bind(this,v); 
     } 
    } 

XML

<package.ExtraView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/rentExtraLayout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:animateLayoutChanges="true" 
    android:background="@color/white"> 

     <TextView 
      android:id="@+id/nameTextView" 
      style="@style/contentTextDark" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="40dp" 
      android:layout_marginStart="40dp" 
      android:layout_marginTop="18dp" 
      app:layout_constraintLeft_toLeftOf="parent" 
      app:layout_constraintTop_toTopOf="parent" 
      tools:text="@string/gps_extra" /> 

     <ImageView 
      android:id="@+id/checkImageView" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginEnd="16dp" 
      android:layout_marginRight="16dp" 
      android:src="@drawable/icon_checkmark_dark" 
      app:layout_constraintBottom_toBottomOf="@+id/nameTextView" 
      app:layout_constraintRight_toRightOf="parent" 
      app:layout_constraintTop_toTopOf="@+id/nameTextView" /> 

     <TextView 
      android:id="@+id/priceTextView" 
      style="@style/contentTextDark" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginEnd="24dp" 
      android:layout_marginRight="24dp" 
      app:layout_constraintRight_toLeftOf="@+id/checkImageView" 
      app:layout_constraintTop_toTopOf="@+id/nameTextView" 
      tools:text="+xx€" /> 

     <View 
      android:id="@+id/lineSplitting" 
      android:layout_width="0dp" 
      android:layout_height="1dp" 
      android:layout_alignParentBottom="true" 
      android:layout_marginTop="10dp" 
      android:background="@color/green" 
      app:layout_constraintHorizontal_bias="0.0" 
      app:layout_constraintLeft_toLeftOf="@+id/nameTextView" 
      app:layout_constraintRight_toRightOf="parent" 
      app:layout_constraintTop_toBottomOf="@+id/nameTextView" /> 


     <LinearLayout 
      android:id="@+id/expandViewLinearLayout" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:orientation="vertical" 
      android:visibility="gone" 
      app:layout_constraintLeft_toLeftOf="parent" 
      app:layout_constraintRight_toRightOf="parent" 
      app:layout_constraintTop_toBottomOf="@+id/lineSplitting"></LinearLayout> 
</package.ExtraView> 

Cela fera hang Android Studio l'application se bloque lors de l'ouverture ce xml. Mais avec ConstraintLayout cela fonctionne. Qu'est-ce que je fais mal? J'ai les dernières bibliothèques téléchargées.

+0

Avez-vous toujours ce problème? – Cheticamp

+0

Yup tout gèle encore ... – WinterChilly

Répondre

0

J'ai relu la conversation et je me suis rendu compte que vous vouliez juste que la présentation présentée soit un élément de RecycleView. Je vous parlais des fragments parce que je pensais que vous vouliez mettre une liste de données dans votre vue supplémentaire. (Donc, mes excuses pour cela: /)

Si vous souhaitez conserver cette séquence de vues pour plusieurs utilisations, c'est le meilleur choix pour faire une vue personnalisée.

  • Pour une vue personnalisée, le problème est de construire votre point de vue avec le motif. Pour ce faire, une façon est de le faire manuellement, car vous avez une séquence de vues sur un niveau.

    public class ExtraView extends ConstraintLayout { 
    
        private TextView mText = null; 
        ... 
    
        public void init(Context context){ 
         int wrapContent = LayoutParams.WRAP_CONTENT; 
         int matchParent = LayoutParams.MATCH_PARENT; 
         setLayoutParams(new LayoutParams(matchParent, wrapContent)); 
         mText = new TextView(getContext()); 
    
         addView(mText, new LinearLayout.LayoutParams(wrapContent, wrapContent)); 
    
         ... // Do the same thing for all elements with parameters 
    
        } 
    } 
    

Ensuite ajoutez votre méthode addExtra, et il est ok, boucle plus et vous pouvez l'utiliser où vous voulez et dans votre onBindViewHolder avec une seule ligne.

Modifier:

Travaillez avec votre XML de mise en page réelle si vous remplacez le nœud racine, complet exemple:

Extraview.javafichier

public class ExtraView extends ConstraintLayout { 

    public ExtraView(Context context) { 
     super(context); 
     init(context); 
    } 

    public ExtraView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context); 
    } 

    public ExtraView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(context); 
    } 

    public void init(Context context) { 
     View v = LayoutInflater.from(context).inflate(R.layout.view_extra_rent_booking, this, true); 
     ButterKnife.bind(this, v); 
    } 

    public void addData(Object data) { 
     Log.e(getClass().getSimpleName(), object.toString()); 
    } 
} 

view_extra_rent_booking.fichier xml

<merge xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/rentExtraLayout" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:animateLayoutChanges="true"> 

<TextView 
    android:id="@+id/nameTextView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="40dp" 
    android:layout_marginStart="40dp" 
    android:layout_marginTop="18dp" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    android:text="test" /> 

<ImageView 
    android:id="@+id/checkImageView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginEnd="16dp" 
    android:layout_marginRight="16dp" 
    app:layout_constraintBottom_toBottomOf="@+id/nameTextView" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintTop_toTopOf="@+id/nameTextView" /> 

<TextView 
    android:id="@+id/priceTextView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginEnd="24dp" 
    android:layout_marginRight="24dp" 
    app:layout_constraintRight_toLeftOf="@+id/checkImageView" 
    app:layout_constraintTop_toTopOf="@+id/nameTextView" 
    android:text="test" /> 

<View 
    android:id="@+id/lineSplitting" 
    android:layout_width="0dp" 
    android:layout_height="1dp" 
    android:layout_alignParentBottom="true" 
    android:layout_marginTop="10dp" 
    app:layout_constraintHorizontal_bias="0.0" 
    app:layout_constraintLeft_toLeftOf="@+id/nameTextView" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintTop_toBottomOf="@+id/nameTextView" /> 


<LinearLayout 
    android:id="@+id/expandViewLinearLayout" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:orientation="vertical" 
    android:visibility="gone" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintTop_toBottomOf="@+id/lineSplitting"> 
    </LinearLayout> 
</merge> 

Activité principale est pour l'échantillon mais réel, il vous est titulaire qui obtiennent la vue onBindViewHolder()

activity_main.xmlfichier

<?xml version="1.0" encoding="utf-8"?> 
<com.kunzisoft.myapplication.ExtraView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/item" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.kunzisoft.myapplication.MainActivity" /> 

MainActivity.javafichier

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ExtraView itemData = (ExtraView) findViewById(R.id.item); 
     itemData.addData("OUIIIIIII"); 
    } 
} 
+0

1 Question, pourquoi ne puis-je pas gonfler la vue et ensuite essayer de lier avec butterknife ou findingViewById, il y a sûrement une meilleure façon de recréer tous les éléments, car le XML est déjà prêt maintenant, il doit juste être prêt à utiliser, mais voici comme il n'y a pas de xml. Merci donc vous comprenez enfin ce que j'essayais de vous dire :) – WinterChilly

+0

Yeh essayez avec votre classe comme dans la question et remplacez ** package.ExtraView ** par ** fusionner **. La racine devrait fusionner avec ConstraintLayout –

+0

Et désolé pour mon mauvais anglais, ce n'est pas ma langue maternelle! ^^ ' –

0

Vous avez une boucle infinie mis en place. Voici ce qui se passe. (Je suppose que le XML vous montrer est view_extra_rent_booking.)

  1. Quelque part vous gonflez ou instanciation autrement view_extra_rent_booking. Dans le cadre de ce processus, la classe ExtraView est instanciée. (C'est ce que fait package.ExtraView dans la présentation XML.)
  2. Au sein de ExtraView vous êtes, encore une fois, gonflant view_extra_rent_booking. Dans le cadre de ce processus, ExtraView est à nouveau créé.
  3. Remettre en boucle à # 1 et répéter.

ConstraintLayout fonctionne parce qu'il ne fait pas de gonflage.

Voici un test rapide qui devrait se comporter comme ConstraintLayout. Changer init() en ExtraView à ce qui suit:

public void init(Context context){ 
    Butterknife.bind(this); // Not sure about this. I don't do Butterknife. 
} 

Cela devrait résoudre votre problème afin que vous puissiez continuer avec votre classe de vue personnalisée.

+0

Essayé même sans butterknife, il se bloque juste ... Le problème est que je ne peux pas le déboguer. Quand j'ai redémarré c'était l'erreur, qui confirme juste ce que vous avez dit. http://prntscr.com/fvd9od – WinterChilly

+0

@WinterChilly Bien que le gonflage dans votre vue personnalisée provoque une boucle infinie, ce n'est pas cette boucle infinie que vous voyez. Il semble que vous obtenez l'erreur dans le concepteur. Quelle version d'Android Studio utilisez-vous? En outre, que contiennent vos '@ style/contentTextDark' et' @ drawable/icon_checkmark_dark'? Je n'ai pas l'erreur, mais je n'ai pas ces ressources. Je suppose que vos couleurs et vos ressources @string ne sont que des constantes. – Cheticamp

+0

@WinterChilly Essayez de reconstruire votre projet. Peut-être que Studio est dans un état étrange. – Cheticamp