0

ConstraintLayoutを実装するカスタムクラスを実装しようとしていますが、これをXMLで使用しようとするとAndroid Studioがハングアップするだけですべてがフリーズし、何もしないで、タスクマネージャーからスタジオを閉じることができます。その後、XMLファイルを開くと同じことが繰り返されます。Constraint Layoutを持つカスタムクラス、Android Studio HANGS

これが表示されます: プレビューのレイアウト中にタイムアウトが発生しました。これは、通常、カスタムビューの1つに無限ループまたは無制限の再帰がある場合に発生します。

基本的に最初に私はConstraintLayoutを使ってUIを設計しましたが、次にConstraintLayoutをこのクラスに置き換えてみました。レンダリングしようとするとフリーズしました。私はNDAのために多くのコードを与えることができません。

クラス:

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> 

これは、Android Studioがハングアップし、このXMLを開くときにアプリがクラッシュするようになります。しかし、ConstraintLayoutではこれが機能します。何が間違っているのですか?最新のライブラリをダウンロードしました。

+0

まだこの問題がありますか? – Cheticamp

+0

うまくいっていますが、まだすべてがフリーズしています... – WinterChilly

答えて

0

会話をもう一度読み直して、提示されたレイアウトをRecycleViewアイテムにしたいと思っただけです。私はあなたがあなたの余分なビューにデータのリストを入れたいと思ったので、断片について教えていました。

この一連のビューをいくつかの用途に使用したい場合は、パーソナライズされたビューを作成することをお勧めします。パーソナライズされたビューについては

  • 、問題は、パターンを使用してビューを構築することです。これを行うには、1つのレベルで一連のビューがあるため、手動で行う方法もあります。

    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 
    
        } 
    } 
    

その後、あなたのaddExtraメソッドを追加し、それは大丈夫、これ以上のループだとあなたが望む場所あなたがそれを使用することができ、あなたの onBindViewHolderのみ1行インチ

編集:あなたの実際のレイアウトのXMLと

仕事あなたがルートノード、フルexempleを交換する場合:

Extraview.javaファイル

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。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> 

ファイルonBindViewHolder()

activity_main.xmlファイル内のビューを取得ホルダー

<?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.javaファイル

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つの質問は、ビューを膨らませて、バターナイフやfindingViewByIdでバインドしようとすると、どうしてXMLが既に存在しているからです今すぐ使用する準備ができている必要がありますが、ここにはxmlがないようです。私があなたに伝えようとしていることをfinnalyに理解していただきありがとうございます:) – WinterChilly

+0

イエスはあなたのクラスのように質問し、** package.ExtraView **を** merge **に置き換えてみてください。ルートはConstraintLayoutとマージする必要があります –

+0

そして、私の悪い英語のために申し訳ありません、私の母国語ではありません! ^^ ' –

0

あなたが設定無限ループを持っています。ここで何が起こっているのですか? (私はあなたが表示されXMLがview_extra_rent_bookingであることを前提としています。)

  1. どこかにあなたが膨らまあるいはview_extra_rent_bookingをインスタンス化しています。このプロセスの一部として、クラスExtraViewがインスタンス化されます。 (これはXMLレイアウトでpackage.ExtraViewが行うことです)
  2. ExtraViewの中で、あなたは再びview_extra_rent_bookingを膨らませています。このプロセスの一部として、ExtraViewが再度作成されます。
  3. ループを#1に戻して繰り返します。

ConstraintLayoutはインフレを起こさないために機能します。

これは、ConstraintLayoutと同じように動作するはずのクイックテストです。以下にExtraViewinit()を変更します。

カスタムビュークラスを続行することができますので、あなたの問題を解決する必要があります
public void init(Context context){ 
    Butterknife.bind(this); // Not sure about this. I don't do Butterknife. 
} 

+0

バターナイフなしでも試してみてください、それはちょうどクラッシュします...問題は私がそれをデバッグできないことです。 私はそれを再起動したとき、これはエラーであり、あなたが言ったことを確認するだけでした。 http://prntscr.com/fvd9od – WinterChilly

+0

@WinterChillyカスタムビューのインフレーションは無限ループを引き起こしますが、それはあなたが見ている無限ループではありません。あなたがデザイナーにエラーを起こしているようです。あなたはどのAndroid Studioのバージョンを使用していますか?また、あなたの '@ style/contentTextDark'と' @ drawable/icon_checkmark_dark'には何がありますか?私はエラーは出ませんが、私はそれらのリソースを持っていません。あなたの色と@stringリソースは単なる定数であると仮定します。 – Cheticamp

+0

@WinterChillyプロジェクトを再ビルドしてみてください。たぶんスタジオは奇妙な状態です。 – Cheticamp

関連する問題