web-dev-qa-db-ja.com

Android Studioレイアウトエディターはカスタムビューをレンダリングできません

Android Studioでは、レイアウトエディターはxmlでカスタムビューをプレビューできません。

非常に簡単な例:

public class MyCustomView extends FrameLayout {
    public MyCustomView(Context context) {
        super(context);
    }

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

    public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
}

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="horizontal">

    <com.myprojectxxx.view.MyCustomView
        Android:layout_width="48dp"
        Android:layout_height="48dp" />

</LinearLayout>

Android Studioは常に、

レンダリングの問題

次のクラスが見つかりませんでした:

  • com.myprojectxxx.view.MyCustomView(ビルドパスの修正、クラスの作成)

ヒント:プロジェクトをビルドしてみてください

もちろん、私はそのクラスを持っています。 [クラスの作成]をクリックすると、同じクラスが既に存在するというエラーが表示されます。そのプロジェクトを再構築しても、何も変わりません。

そして、はい、プロジェクトは私のAndroidデバイスで非常にうまく機能します。また、Eclipse ADTで非常によくレンダリングされます。ただし、Android Studio、it 「クラスは見つかりませんでした」と常に言います。

Android Studioには、カスタムビューでxmlファイルをプレビューする機能がありませんか?これの何が問題になっていますか?

46
Naetmul

カスタムビューコンポーネントもサポートされ、IDEAで正しく表示されますが、IntelliJ IDEAは出力ディレクトリのクラスファイルを使用してそのようなコンポーネントをレンダリングするため、最初にプロジェクトでbuild-> make projectを実行する必要があります。

enter image description here

参照

20
Badamchi

同じ問題に直面して、3つと4つの引数コンストラクタをオーバーライドする必要がありました。

public View(Context context, AttributeSet attrs, int defStyle) public View(Context context, AttributeSet attrs, int defStyle, int defStyleRes)

次に、プロジェクトを再構築します。

5
SleepyTonic

今日わかったように、ついに、レイアウトのレンダリング中の「Classdefが見つかりません」などのエラーは実際には誤解を招きます。本当に意味するのは、ウィジェットの実行中にsomeエラーが発生するということです。

問題がどこにあるのかを見つける最も簡単な方法は次のとおりです。

  1. XMLレイアウトファイルで、カスタムビュークラス(わかりやすくするために「MyFrameLayout」と呼びます)をAndroidストッククラス(FrameLayoutなど)に置き換えます。レイアウトエディターが機能することを確認します。 ...」属性を使用すると、空のレイアウトではなくコンテンツを表示できます。たとえば、カスタムビューにEditTextウィジェットがある場合は、この属性を追加します。これはデザインモードでのみ使用されます。

    _tools:text="Sample content"
    _

(「ツール:ネームスペースはAndroid Studioによって自動的に追加されます)

  1. 元のクラス名(「MyFrameLayout」など)をXMLレイアウトに戻します。今は機能しますか?

そうでない場合:

  1. 便宜上、カスタムビューの定義を一時的な新しいクラス(「MyFrameLayoutBeforeFix」など)にコピーします。これを使用して、今すぐ変更を開始する「MyFrameLayout」クラスと比較します。

  2. Android Studioを使用して「MyFrameLayout」クラスをゼロから再作成します。絶対最小から開始します。コンパイルする必要があります。その結果、Javaクラスには「extends 「FrameLayout」および必要なコンストラクタ/メソッド。この場合:

    _package com.myprojectxxx.view;
    
    import Android.content.Context;
    import Android.util.AttributeSet;
    import Android.widget.FrameLayout;
    
    public class MyFrameLayout  extends FrameLayout {
        public MyFrameLayout(Context context) {
            super(context);
        }
    
        public MyFrameLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    }
    _
  3. このカスタムビューが正常にレンダリングされることを確認してください。少なくとも2016年には!

  4. 「MyFrameLayoutBeforeFix」コピーからこのクラスにコードを1つずつ移動し、各ステップでエラーがないことを確認します...

上記のシーケンスは明白に思えますが、私にとってはうまくいきました。秘Editorは、レイアウトエディターが独自のコンテキストでクラスを起動することです。これにより、コード内で予期しないエラーが発生する可能性があります。

もう1つのトリックは、ウィジェットのコードでisInEditMode()チェックを使用してパーツをスキップすることです。これはデザインビューでは機能しない場合があります。例えば。:

MyClass myClass = isInEditMode() ? null : MyClass.getInstance();

4
yvolk

次のコミットで修正する必要があります。

https://Android-review.googlesource.com/#/c/59090/

1
Naetmul

また、レイアウトのレンダリングに間違ったテーマを使用している可能性もあります。プロジェクトで使用しているものを選択してください。

enter image description here

0