Я получаю "не могу найти метод символа setMargins(int, int, int, int)", когда я пытаюсь установить поля EditText
Я пытаюсь установить поля нескольких виджетов EditText с помощью setMargins(), но я получаю:
Ошибка: не удается найти метод символа setMarings(int, int, int, int).
Есть идеи? Это XML:
<ScrollView
android:layout_width="384dp"
android:layout_height="589dp"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="24dp"
android:scrollbarStyle="insideOverlay"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</ScrollView>
И это та часть моего кода:
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewGroup;
import android.widget.ScrollView;
import android.view.ViewGroup.MarginLayoutParams;
LinearLayout linearLayout = LinearLayout)findViewById(R.id.linearLayout);
//noc is users' input
for (int i = 1; i<=noc; i++) {
EditText eText = new EditText(this);
eText.setId(i);
eText.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
//For example:
eText.setMargins(24,0,24,0);
linearLayout.addView(eText);
}
Все работает хорошо, если я просто забуду о полях, но было бы лучше, если бы я мог установить их.
3 ответа
Основная причина: Ваш код для установки полей не верен.
Решение: измените свой код
От
LinearLayout linearLayout = LinearLayout)findViewById(R.id.linearLayout);
//noc is users' input
for (int i = 1; i<=noc; i++) {
EditText eText = new EditText(this);
eText.setId(i);
eText.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
//For example:
eText.setMargins(24,0,24,0);
linearLayout.addView(eText);
}
к
LinearLayout linearLayout = findViewById(R.id.linearLayout);
//noc is users' input
for (int i = 1; i <= noc; i++) {
EditText eText = new EditText(this);
eText.setId(i);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(24, 0, 24, 0);
eText.setLayoutParams(layoutParams);
linearLayout.addView(eText);
}
Вы должны вызвать метод setMargins
в экземпляре LayoutParams нет в представлении View.
LinearLayout linearLayout = LinearLayout)findViewById(R.id.linearLayout);
for (int i = 1; i<=noc; i++) {
EditText eText = new EditText(this);
eText.setId(i);
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(24, 0, 24, 0);
eText.setLayoutParams(params);
linearLayout.addView(eText);
}
Когда вы устанавливаете поля в XML, это выглядит так:
android:layout_margin="16dp"
Любой атрибут с префиксом layout_
на самом деле будет атрибутом этого представления LayoutParams
объект. Это имеет смысл: работа LayoutParams
состоит в том, чтобы общаться с родительским взглядом на то, как ребенок хочет быть выложенным, и поля являются частью этого процесса.
setMargins()
метод является частью ViewGroup.MarginLayoutParams
учебный класс. Самый стандартный ViewGroup
с этим (как LinearLayout.LayoutParams
, так далее). Так что вы можете сделать что-то вроде этого:
MarginLayoutParams params = (MarginLayoutParams) eText.getLayoutParams();
params.setMargin(16, 16, 16, 16);
eText.setLayoutParams(params);
Обязательно позвони setLayoutParams()
когда вы закончите настройку полей, иначе ваши обновления не вступят в силу.