为什么imageView在Android中会加倍?

时间:2019-02-12 18:15:01

标签: android android-layout

我在android布局中遇到问题,我不知道这是什么问题。 实际上,我想更改图像旁边文本的字体。 当我没有在xml代码中的textViews中放入任何文本,而是在Java代码中设置了文本并设置了字体时,我遇到了这个问题。

这是我的 group_view_two_4_first_activity.xml 文件:     

    <android.support.v7.widget.CardView
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_marginStart="16dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        app:cardCornerRadius="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/sport_complex_name"
        app:layout_constraintTop_toTopOf="@+id/sport_complex_name">

        <ImageView
            android:id="@+id/image"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="fitXY"
            android:src="@drawable/field" />

    </android.support.v7.widget.CardView>

    <TextView
        android:id="@+id/sport_complex_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:textColor="#565657"
        android:textSize="20sp"
        android:textStyle="bold"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/hallNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:textColor="#7E7E7F"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="@+id/sport_complex_name"
        app:layout_constraintTop_toBottomOf="@+id/sport_complex_name" />

    <TextView
        android:id="@+id/number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#7E7E7F"
        android:textSize="18sp"

        app:layout_constraintBottom_toBottomOf="@+id/hallNumber"
        app:layout_constraintEnd_toStartOf="@+id/hallNumber"
        app:layout_constraintTop_toTopOf="@+id/hallNumber" />

</android.support.constraint.ConstraintLayout>

这是它的java文件: GroupViewTwo4FirstActivity

public class GroupViewTwo4FirstActivity extends ConstraintLayout {

    View rootView;
    TextView sportComplexName;
    TextView hallNumber;
    TextView number;
    String txtNo;
    String complexName;
    public GroupViewTwo4FirstActivity(Context context) {
        super(context);
        init(context);
    }

    public GroupViewTwo4FirstActivity(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        init(context);
    }

    public GroupViewTwo4FirstActivity(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.GroupViewTwo4FirstActivity, defStyleAttr, 0);
        txtNo = ta.getString(R.styleable.GroupViewTwo4FirstActivity_hallNo);
        complexName = ta.getString(R.styleable.GroupViewTwo4FirstActivity_complex_name);
        ta.recycle();
        init(context);
    }

    private void init(Context context) {
        rootView = inflate(context, R.layout.group_view_two_4_first_activity, this);
        Typeface typeface = EnglishToPersian.createTypeFace1(context);
        sportComplexName = rootView.findViewById(R.id.sport_complex_name);
        hallNumber = rootView.findViewById(R.id.hallNumber);
        number = rootView.findViewById(R.id.number);
        sportComplexName.setTypeface(typeface);
        hallNumber.setTypeface(typeface);
        number.setTypeface(typeface);

        number.setText(EnglishToPersian.englishToPersian(txtNo));
        hallNumber.setText("سالن شماره ");
        sportComplexName.setText("مجتمع ورزشی افق لاله");

    }
}

一切都很好,但是当我运行程序时,没有得到这张图片: Wanted

我得到了这个:Bug

1 个答案:

答案 0 :(得分:1)

从xml膨胀时被调用的构造函数是这样的:

public GroupViewTwo4FirstActivity(Context context, AttributeSet attrs) {
  this(context, attrs, 0);
  init(context);
}

this(context,attrs,0)调用您的第三个构造函数,此后构造函数同时调用init(context),然后又调用init(context),因此您要执行两次。

按以下方式定义构造函数可确保您的init方法每次都被调用一次。

public GroupViewTwo4FirstActivity(Context context) {
  this(context, null);
}

public GroupViewTwo4FirstActivity(Context context, AttributeSet attrs) {
  this(context, attrs, 0);
}

public GroupViewTwo4FirstActivity(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.GroupViewTwo4FirstActivity, defStyleAttr, 0);
  txtNo = ta.getString(R.styleable.GroupViewTwo4FirstActivity_hallNo);
  complexName = ta.getString(R.styleable.GroupViewTwo4FirstActivity_complex_name);
  ta.recycle();
  init(context);
}

希望有帮助!