在 LinearLayout 中找到 child 个 LinearLayout
Find child of a LinearLayout inside a LinearLayout
我有一个已在 xml 中创建的 LinearLayout ("ll"),应用会在其中动态创建另一个 LinearLayout,并在该视图中创建一个 EditText 和一个 Button。按钮让整个LinearLayout连同里面的EditText和Button一起销毁(整个系统就是玩家名输入activity)。无论如何,我正在尝试找到一种从所有 EditTexts 中获取文本的方法。我尝试在 "ll" 上使用 for 循环并使用 ll.getChildAt()
但我似乎无法在 ll.getChildAt()
生成的任何内容上使用 .getChildAt()
因为 getChildAt()
生成 "View" 不是 "LinearLayout." 我基本上只需要一种方法来搜索两个 children,而不是一个。另外,如果有更好的方法我应该这样做,请告诉我。我乐于接受建议。
这是我的代码,如果有帮助的话:
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 中添加了水平方向的 linearLayout,因此您已经为父布局的子布局(即 playerView)编写了代码。我修改了代码以获取子线性布局的元素,Log 打印 EditText 中的所有文本。
希望对您有所帮助!!
我有一个已在 xml 中创建的 LinearLayout ("ll"),应用会在其中动态创建另一个 LinearLayout,并在该视图中创建一个 EditText 和一个 Button。按钮让整个LinearLayout连同里面的EditText和Button一起销毁(整个系统就是玩家名输入activity)。无论如何,我正在尝试找到一种从所有 EditTexts 中获取文本的方法。我尝试在 "ll" 上使用 for 循环并使用 ll.getChildAt()
但我似乎无法在 ll.getChildAt()
生成的任何内容上使用 .getChildAt()
因为 getChildAt()
生成 "View" 不是 "LinearLayout." 我基本上只需要一种方法来搜索两个 children,而不是一个。另外,如果有更好的方法我应该这样做,请告诉我。我乐于接受建议。
这是我的代码,如果有帮助的话:
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 中添加了水平方向的 linearLayout,因此您已经为父布局的子布局(即 playerView)编写了代码。我修改了代码以获取子线性布局的元素,Log 打印 EditText 中的所有文本。
希望对您有所帮助!!