У меня есть LinearLayout ("ll"), который уже создан в xml, и приложение динамически создает внутри него другой LinearLayout и создает EditText и Button внутри этого представления. Кнопка заставляет весь LinearLayout уничтожить себя вместе с EditText и Button внутри него (вся система - это имя игрока, входящее в действие). В любом случае, я пытаюсь найти способ получить текст из всех EditTexts. Я пробовал использовать цикл for на «ll» и использовать ll.getChildAt(), но я не могу использовать .getChildAt() на том, что генерирует ll.getChildAt(), потому что getChildAt() генерирует «View», а не «LinearLayout». Мне просто нужен способ обыскать двух детей, а не одного. Кроме того, если есть лучший способ сделать это, дайте мне знать. Я открыт для предложений.
Вот мой код, если он поможет:
NewGameCreate.java
public class NewGameCreate extends Activity {
int numOfPlayers = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.new_game_create);
}
public void newPlayer(View view) {
numOfPlayers++;
final LinearLayout ll = findViewById(R.id.playerView);
final LinearLayout llNew = new LinearLayout(getApplicationContext());
llNew.setOrientation(LinearLayout.HORIZONTAL);
llNew.setId(numOfPlayers);
ll.addView(llNew);
EditText newName = new EditText(this);
newName.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1));
newName.setHint("Enter Player Name");
newName.setId(numOfPlayers);
newName.setWidth(0);
llNew.addView(newName);
final Button delete = new Button(this);
delete.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0));
delete.setText("Delete");
delete.setId(numOfPlayers);
delete.setWidth(0);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int id = delete.getId();
ll.removeViewInLayout(findViewById(id));
Drawable back = ll.getBackground();
ll.setBackgroundColor(00000000);
ll.setBackground(back);
ll.invalidate();
}
});
llNew.addView(delete);
}
public void startGame(View view){
LinearLayout ll = findViewById(R.id.playerView);
List text = new ArrayList();
for(int loop = 0; loop < ll.getChildCount(); loop++) {
//this is the code in question and where I want to get the text from
//all my EditTexts
LinearLayout inner = ll.getChildAt(loop);
}
}
}
Думаю, я нашел на него ответ. Вам нужно немного изменить код в методе startGame (). Я предоставляю код для startGame ниже.
public void startGame(View view) {
LinearLayout ll = findViewById(R.id.playerView);
List text = new ArrayList();
for (int loop = 0; loop < ll.getChildCount(); loop++) {
//this is the code in question and where I want to get the text from
//all my EditTexts
LinearLayout inner = (LinearLayout) ll.getChildAt(loop);
for (int j = 0; j < inner.getChildCount(); j++) {
if (inner.getChildAt(j) instanceof EditText) {
EditText textET = (EditText) inner.getChildAt(j);
Log.d("TAG",textET.getText().toString());
}
}
}
}
В приведенном выше коде вы смогли получить только первого дочернего элемента, но поскольку вы добавили linearLayout с ориентацией Horizontal в родительский LinearLayout с ориентацией Vertical, вы написали код для дочернего элемента родительского макета, то есть playerView. Я изменил код, чтобы получить элементы дочернего линейного макета, и журнал печатает весь текст из EditText.
Надеюсь, это поможет!!
С радостью помогу!
Так что в основном мне просто нужно было добавить
(LinearLayout)перед.getChildAt(). Спасибо вам за помощь! Это работает :)