[Android]动态加载布局获取布局内控件的ID

__椎名真白 2018-03-19 09:30:02

向大佬们请教一个可能比较小孩的问题。。。
动态加载布局之后,怎么获得加载的布局里面的控件ID啊。。。
有一个还好。。直接获取ID就完事了。。

再增加一个,就不知道了。。。

我需要在动态加载布局之后,不管增加了多少布局,都能获取到所有的资源ID,以便点击完成按钮时可以对所有编辑框内的内容进行检查。查了一下有说设置ID的,setTAG(),但是ID若不是唯一,有重复,则该控件所有设置无效。要怎么设置ID才能唯一,还是可以通过其他方法实现预期效果。
这是活动代码:
package com.my.wordbar.activity;

import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.my.wordbar.R;

import java.lang.reflect.Method;

public class AddWordToDBActivity extends BaseActivity {

private LinearLayout mBaseRootLayout; //基本释义根布局

private EditText mWordName; //单词名称
private EditText mWordType; //词性
private EditText mWordMean; //释义
private EditText mWordExampleEnglish; //英文
private EditText mWordExampleChinese; //中文

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_word_to_db);

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

ActionBar actionBar = getSupportActionBar(); //获取ActionBar实例,具体实现由Toolbar完成
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true); //显示导航按钮设置为true
}

//关联控件
mWordName = (EditText) findViewById(R.id.word_name);
mWordType = (EditText) findViewById(R.id.word_type);
mWordMean = (EditText) findViewById(R.id.word_mean);
mWordExampleEnglish = (EditText) findViewById(R.id.word_english);
mWordExampleChinese = (EditText) findViewById(R.id.word_chinese);

//获取LayoutInflater实例
final LayoutInflater inflater = LayoutInflater.from(this);

//添加按钮的点击事件,动态加载布局
final ImageView addBase = (ImageView) findViewById(R.id.add_base);
addBase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

//获取根布局
mBaseRootLayout = (LinearLayout) findViewById(R.id.my_base_root);
//获取子布局
LinearLayout baseLayout = (LinearLayout)inflater.inflate(R.layout.ll_word_base, null);
//添加到布局中
mBaseRootLayout.addView(baseLayout);

}
});


}


/**
* 加载toolbar布局
* */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.addword_activity_toolbar, menu);
return true;
}

/**
* 为标题栏按钮设置点击事件
* */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {

case R.id.add_word_action_ok:
addWord();
break;
case android.R.id.home:
Intent intent = new Intent(AddWordToDBActivity.this,MainActivity.class);
startActivity(intent);
finish();
break;
default:
break;
}
return true;
}

/**
* 添加单词到单词本,即数据库
* */
private void addWord() {
// Toast.makeText(this, "功能尚未完成!", Toast.LENGTH_SHORT).show();
AlertDialog.Builder dialog = new AlertDialog.Builder(AddWordToDBActivity.this);
dialog.setTitle("提示:");
dialog.setMessage("单词名称:" + mWordName.getText()
+ "\n单词词性:" + mWordType.getText()
+ "\n单词释义:" + mWordMean.getText()
+ "\n例句英文:" + mWordExampleEnglish.getText()
+ "\n例句中文:" + mWordExampleChinese.getText());
dialog.setCancelable(false);
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//什么都不做
}
});
dialog.show();
}

// 让菜单同时显示图标和文字
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if (menu != null) {
if (menu.getClass().getSimpleName().equalsIgnoreCase("MenuBuilder")) {
try {
Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
method.setAccessible(true);
method.invoke(menu, true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return super.onMenuOpened(featureId, menu);
}

}

第一次弄动态加载XML,有点蒙蔽。。。求指点一下。。

别讨论布局了,能力有限,写不出来好看的。。



...全文
1194 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
__椎名真白 2018-03-21
  • 打赏
  • 举报
回复
已解决。使用根布局对象去找子控件就好了。动态删除布局可以使用一个List来装填增加的布局,删除就直接获取最后添加的,GONE。
代码:
package com.my.wordbar.activity;

import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.my.wordbar.R;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class AddWordToDBActivity extends BaseActivity implements View.OnClickListener {

private LinearLayout mBaseRootLayout; //基本释义根布局
private LinearLayout mExampleRootLayout; //相关例句根布局

private EditText mWordName; //单词名称
private EditText mWordType; //词性
private EditText mWordMean; //释义
private EditText mWordExampleEnglish; //英文
private EditText mWordExampleChinese; //中文

private List<LinearLayout> mBaseLayoutList; //基本释义布局列表
private List<LinearLayout> mExampleLayoutList; //相关例句布局列表

private List<EditText> mTypeList; //词性列表
private List<EditText> mMeanList; //释义列表
private List<EditText> mEnglishList; //英文列表
private List<EditText> mChineseList; //中文列表

// private ImageView mAddBase = null; //增加释义
// private ImageView mDeleteBase = null; //删除释义
// private ImageView mAddExample = null; //增加例句
// private ImageView mDeleteExample = null; //删除例句

private Button mAddBase; //增加释义
private Button mDeleteBase; //删除释义
private Button mAddExample; //增加例句
private Button mDeleteExample; //删除例句

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_word_to_db);

initViews(); //初始化控件

mAddBase.setOnClickListener(this); //增加释义点击事件
mAddExample.setOnClickListener(this); //增加例句点击事件

mDeleteBase.setOnClickListener(this); //删除释义点击事件
mDeleteExample.setOnClickListener(this); //删除例句点击事件

}

/**
* 关联控件,初始化列表
*/
private void initViews() {

//使用Toolbar
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

ActionBar actionBar = getSupportActionBar(); //获取ActionBar实例,具体实现由Toolbar完成
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true); //显示导航按钮设置为true
}

//关联控件
mBaseRootLayout = (LinearLayout) findViewById(R.id.my_base_root);
mExampleRootLayout = (LinearLayout) findViewById(R.id.my_example_root);

mWordName = (EditText) findViewById(R.id.word_name);
mWordType = (EditText) findViewById(R.id.word_type);
mWordMean = (EditText) findViewById(R.id.word_mean);
mWordExampleEnglish = (EditText) findViewById(R.id.word_english);
mWordExampleChinese = (EditText) findViewById(R.id.word_chinese);

mAddBase = (Button) findViewById(R.id.add_base);
mDeleteBase = (Button) findViewById(R.id.delete_base);
mAddExample = (Button) findViewById(R.id.add_example);
mDeleteExample = (Button) findViewById(R.id.delete_example);

//初始化列表
mTypeList = new ArrayList<>();
mMeanList = new ArrayList<>();
mEnglishList = new ArrayList<>();
mChineseList = new ArrayList<>();

mBaseLayoutList = new ArrayList<>();
mExampleLayoutList = new ArrayList<>();

}

/**
* 加减号的点击事件
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.add_base: {
addBase();
}
break;
case R.id.delete_base: {
deleteBase();
}
break;
case R.id.add_example: {
addExample();
}
break;
case R.id.delete_example: {
deleteExample();
}
break;
}
}

/**
* 增加释义
*/
private void addBase() {
LayoutInflater mBaseInflater = LayoutInflater.from(this); //基本释义LayoutInflater实例
//获取子布局
LinearLayout baseLayout = (LinearLayout) mBaseInflater.inflate(R.layout.ll_word_base, null);
//添加到父布局中
mBaseRootLayout.addView(baseLayout);

EditText typeTemp = (EditText) baseLayout.findViewById(R.id.word_type);
EditText meanTemp = (EditText) baseLayout.findViewById(R.id.word_mean);

mTypeList.add(typeTemp);
mMeanList.add(meanTemp);

mBaseLayoutList.add(baseLayout);
}

/**
* 删除释义
*/
private void deleteBase() {
int size = mBaseLayoutList.size();
if (size == 0) {
Toast.makeText(this, "释义至少需要一个!", Toast.LENGTH_SHORT).show();
} else {
mBaseLayoutList.get(size - 1).setVisibility(View.GONE);
mBaseLayoutList.remove(size - 1);
}
}

/**
* 增加例句
*/
private void addExample() {

LayoutInflater mExampleInflater = LayoutInflater.from(this); //相关例句LayoutInflater实例

//获取子布局
LinearLayout exampleLayout = (LinearLayout) mExampleInflater.inflate(R.layout.ll_word_example, null);
//添加到父布局中
mExampleRootLayout.addView(exampleLayout);

EditText englishTemp = (EditText) exampleLayout.findViewById(R.id.word_english);
EditText chineseTemp = (EditText) exampleLayout.findViewById(R.id.word_chinese);

mEnglishList.add(englishTemp);
mChineseList.add(chineseTemp);

mExampleLayoutList.add(exampleLayout);
}

/**
* 删除例句
*/
private void deleteExample() {
int size = mExampleLayoutList.size();
if (size == 0) {
Toast.makeText(this, "无法删除!但例句非必填项,可以不填写。", Toast.LENGTH_SHORT).show();
} else {
mExampleLayoutList.get(size - 1).setVisibility(View.GONE);
mExampleLayoutList.remove(size - 1);
}
}

/**
* 加载toolbar布局
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.addword_activity_toolbar, menu);
return true;
}

/**
* 为标题栏按钮设置点击事件
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {

case R.id.add_word_action_ok:
addWord();
break;
case android.R.id.home:
Intent intent = new Intent(AddWordToDBActivity.this, MainActivity.class);
startActivity(intent);
finish();
break;
default:
break;
}
return true;
}

/**
* 添加单词到单词本,即数据库
*/
private void addWord() {
// Toast.makeText(this, "功能尚未完成!", Toast.LENGTH_SHORT).show();

int typeListSize = mTypeList.size();
int meanListSize = mMeanList.size();
int englishListSize = mEnglishList.size();
int chineseListSize = mChineseList.size();

//遍历所有数据框,检查数据是否合法

}

/**
* 警告框,用于提示用户输入数据不合法或重新输入
*
* @param message 提示信息
*/
private void warnDialog(String message) {
AlertDialog.Builder dialog = new AlertDialog.Builder(AddWordToDBActivity.this);
dialog.setTitle("提示:");
dialog.setMessage(message);
dialog.setCancelable(false);
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//什么都不做
}
});
dialog.show();
}

/**
* 添加成功提示框
*/
private void successDialog() {
AlertDialog.Builder dialog = new AlertDialog.Builder(AddWordToDBActivity.this);
dialog.setTitle("提示:");
dialog.setMessage("添加单词成功!");
dialog.setCancelable(false);
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

//回到编辑界面

}
});
dialog.setNegativeButton("重新添加", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

//清空所有编辑框内容逻辑

}
});
dialog.show();
}

/**
* 让菜单同时显示图标和文字
*
* @param featureId
* @param menu
* @return
*/
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if (menu != null) {
if (menu.getClass().getSimpleName().equalsIgnoreCase("MenuBuilder")) {
try {
Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
method.setAccessible(true);
method.invoke(menu, true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return super.onMenuOpened(featureId, menu);
}
}


jklwan 2018-03-20
  • 打赏
  • 举报
回复
设置id是为了获取控件是吗,但是你添加布局的时候就能获取到View对象了,为什么还要多此一举呢。 如果必须设置id,参考这个链接
__椎名真白 2018-03-20
  • 打赏
  • 举报
回复
引用 1楼jklwan 的回复:
设置id是为了获取控件是吗,但是你添加布局的时候就能获取到View对象了,为什么还要多此一举呢。 如果必须设置id,参考这个链接

80,356

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧