3

という名前のアプリのカスタム ビューがありますAvatarView

<?xml version="1.0" encoding="utf-8"?>
<com.ulouder.views.AdvancedRelativeLayout android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_gravity="center_horizontal"
    android:layout_margin="0dp"
    android:padding="0dp"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="CP"
        android:id="@+id/initialsView"
        android:layout_alignTop="@+id/avatarView"
        android:layout_alignLeft="@+id/avatarView"
        android:layout_alignBottom="@+id/avatarView"
        android:layout_alignRight="@+id/avatarView"
        android:background="@drawable/avatar_background"
        android:textColor="@color/white"
        android:gravity="center"
        android:textStyle="bold"
        android:textSize="8sp" />

    <com.makeramen.roundedimageview.RoundedImageView
        app:riv_corner_radius="20dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/avatarView"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="4dp"
        android:layout_marginLeft="4dp"
        android:layout_marginBottom="4dp"
        app:riv_border_color="@color/lightGray"
        app:riv_border_width="0.2dp" />

</com.uLouder.views.AdvancedRelativeLayout>

AdvancedRelativeLayoutRelativeLayout小さな修正を加えた単なるスーパークラスであり、特別なことは何もありません。次に、カスタム ビューを使用するビューを作成しました。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
<com.ulouder.views.AvatarView
    android:layout_width="50dp"
    android:layout_height="50dp"/>

</LinearLayout>

空想も何もありません。しかし、2 番目のレイアウト XML のデザイナー ビューでは、次のようになります。

ここに画像の説明を入力

エディターは、それ自体のネストされたインスタンスがあるようにビュー階層を表示しますが、明らかに存在しません。どちらかを削除すると、両方が削除されます。それらの1つで属性を宣言すると、他のものもそれを取得します。それらは明らかに同じインスタンスです。唯一の例外は、ID の設定です。その後、問題はなくなり、期待どおりに単一のインスタンスのみが表示されます。

プロジェクトを再構築し、Android Studio を再起動しましたが、それでも同じです。私は何を間違っていますか?

更新:いいえ、今、編集後id、問題はまだ続いています。

更新 2:単なるレイアウトではないため、<include>タグを使用できません。カスタム ロジックを内部に持つカスタム ビューです。

更新 3:これが私のカスタム ビューの (関連する) コードです。

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

    TextView initialsView;
    RoundedImageView imageView;


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

    void init(){
        inflate(getContext(), R.layout.view_avatar, this);
        initialsView = (TextView) findViewById(R.id.innerInitialsView);
        imageView = (RoundedImageView) findViewById(R.id.innerImageView);
    }

    @SuppressWarnings("SuspiciousNameCombination")
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec); //always square
        imageView.setCornerRadius(widthMeasureSpec / 2f);
        initialsView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, widthMeasureSpec * 30f);
    }

}

更新 4:これはAvatarView、1 か所だけでなく、カスタム クラスを配置した場所で発生するようです。

4

1 に答える 1

0

カスタム ビューのドキュメントを確認した後、クラス コンストラクター メソッド内で同じビューをインフレートする理由は見つかりませんでした。init メソッド内の inflate を削除してみてください。

...

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

...

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

void init(){
//  inflate(getContext(), R.layout.view_avatar, this);
    initialsView = (TextView) findViewById(R.id.innerInitialsView);
    imageView = (RoundedImageView) findViewById(R.id.innerImageView);
}

...
于 2016-06-03T02:03:06.257 に答える