16

ADT Eclipse プラグインを使用して、レイアウト XML のグラフィカル プレビューでカスタム ビューをデバッグするにはどうすればよいですか?


カスタム ビューを作成し、それをレイアウト XML に配置すると、ADT Graphical Layout Editorでプレビューできます。Google の人たちがGoogle I/O 2011: Android Development Toolsで行った方法のように、カスタム ビューを表示できます。ただし、カスタム ビューはプレビューで正しく動作しません (エミュレーター/デバイスでは問題ありませんが、使用していませんView.isInEditMode())。変数の値が間違っていると思いますが、確認できません。私はもう試した:

4

2 に答える 2

6

良い質問!私は同じことを疑問に思っています。レイアウト エディターで適切なプレビューを表示することは非常に困難であり、「isineditmode」が true の場合にできることとできないことに関するドキュメントはほとんどないようです (たとえば、コンストラクターで受信した AttributeSet のカスタム XML 属性を分析する)。ビューが機能していないように見えるなど)。

カスタム ビューで ID でビューを見つけるのにも問題があります。みたいな簡単なこと

mTextView = (TextView)myLayout.findViewById(R.id.view_id);

カスタム ビュー レイアウトを膨張させた後、エディターからレイアウトを実行する場合にのみ null が返されます (つまり、isineditmode() == true)。電話でアプリを実行すると動作します。

レイアウト エディターでレイアウトをより適切にプレビューしようとしたときに役立ったものをここに残します。

1-ビューの検索: 編集モードでは findViewWithTag() 関数が機能するため、TAG プロパティを使用します。だから私はタグのIDを使用します

<TextView
    android:id="@+id/myTextViewId"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    ...
    android:tag="mytextViewId" />

次に、タグを使用してビューを見つけます。

if(isineditmode()){
    ((TextView)myLayout.findViewWithTag("myTextViewId")).setText("Test text");
}

2-いくつかの値をチェックして、編集モードでカスタム ビューをインスタンス化できないことがある理由を確認するか、一部のプロパティを編集モードでクエリしてその値を認識できるかどうかを確認します。カスタム ビューを配置する親レイアウトで特別なテキストビューを使用し、非表示にして特別なタグを付けたままにします。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > 

    ...

    <com.example.myCustomView ... />

    ...

    <TextView
        android:id="@+id/DebugView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:tag="debug"
        android:textSize="16sp"
        android:textColor="#FFFFFF"
        android:visibility="gone"
     />

</LinearLayout>

この線形レイアウトはカスタム ビューの親になり、カスタム ビューをプレビューするためにレイアウト エディターで開く必要があります。「デバッグ」テキストビューの可視性は「なくなった」ので、必要がなければ邪魔しません。次に、何かを確認する必要がある場合は、カスタム ビューの Java コードで次のことを行います。

if(isineditmode()){
    TextView wDebugView = (TextView)this.getRootView().findViewWithTag("debug");
    wDebugView.setVisibility(View.VISIBLE);
    wDebugView.setText(Integer.valueOf(getPaddingTop()).toString());
}

この例では、上部のパディングなど、ビューのプロパティを確認します。

重要な注意: 「デバッグ」ビューに表示する値を手動で文字列に変換する必要があります。そうしないと、クラッシュしてエラーが発生します。

それが役に立てば幸い。

また、id によるビューの検索がうまくいかない理由を誰かが知っている場合は、助けていただければ幸いです。

于 2013-01-20T08:39:35.453 に答える
3

これはイライラすることに同意します。私にとって findViewWithTag() は機能しません.ADTプレビューモードでは常にnullを返します。しかし、ローカル (非 Android) ファイルへの単純なログを設定し、カスタム ビューをテール デバッグすることができました。

/** ONLY FOR ECLIPSE: enables us to do some basic logging to a file to debug our custom views in Eclipse preview mode */ 
public static void eclipseEditModeLog(View view, String s) {
    if (view.isInEditMode()) {
        try {
            // Open our hack log file in append mode
            if (eclipseLogOut == null) {
                File eclipseLogFile = new File("/home/mwk/tmp/eclipse.log");
                eclipseLogOut = new BufferedWriter(new FileWriter(eclipseLogFile, true));
            }
            eclipseLogOut.write(new Date().toLocaleString() + ": " + s + "\n");
            eclipseLogOut.flush();
        } catch (IOException e) {}
    }
}
private static BufferedWriter eclipseLogOut = null;
于 2013-05-14T04:31:29.433 に答える