Java 当我想在android中动态创建按钮时,为什么我的应用程序不工作?
我正在开发一个android应用程序,我有一个小问题。 我想动态地做十个按钮。如果我直接设置按钮文本,它可以很好地创建十个按钮Java 当我想在android中动态创建按钮时,为什么我的应用程序不工作?,java,android,Java,Android,我正在开发一个android应用程序,我有一个小问题。 我想动态地做十个按钮。如果我直接设置按钮文本,它可以很好地创建十个按钮 LinearLayout ll=(LinearLayout)findViewById(R.id.lil); for(int i = 0; i <= 9; i++) { Button B = new Button(this); B.setTextSize(TypedValue.COMPLEX_UNIT_DIP,10); B.setText("
LinearLayout ll=(LinearLayout)findViewById(R.id.lil);
for(int i = 0; i <= 9; i++) {
Button B = new Button(this);
B.setTextSize(TypedValue.COMPLEX_UNIT_DIP,10);
B.setText("1");
ll.addView(B);
}
但是,当我尝试像下面这样设置文本时,它只生成一个没有任何文本的按钮
String BtnText = "";
String temp = "";
String []DD = new String [3];
LinearLayout ll = (LinearLayout)findViewById(R.id.lil);
for (int i = 0; i <= 9; i++) {
temp = SplitData[i];
DD = temp.split("/");
BtnText = DD[0].toString();
Button B = new Button(this);
B.setTextSize(TypedValue.COMPLEX_UNIT_DIP,10);
B.setText(BtnText);
ll.addView(B);
}
令人惊讶的是,我逐行调试了我的应用程序,却没有发现任何问题。一切正常。我没有任何例外。你有什么建议吗
完整代码:
public class MainActivity extends Activity {
String WebData = ""; // Data from Web Server
int DC = 0; // Data Co0unter
String[] SplitData = new String[10]; //Split Data array
protected void DataCollector(String ReciveData) {
WebData = ReciveData;
}
private void Spliter() {
SplitData = WebData.split("-");
}
private void CreateUI() {
String BtnText = "";
Button B = null;
//String temp = "";
//String []DD = new String [3];
LinearLayout ll = (LinearLayout)findViewById(R.id.ll);
try {
for (String aSplitData : SplitData) {
BtnText = aSplitData.split("/")[0];
B = new Button(this);
B.setTextSize(TypedValue.COMPLEX_UNIT_DIP,10);
B.setText(BtnText);
ll.addView(B);
}
}
catch (Exception ex) {
Log.d("Error : ",ex.toString());
}
}
class RetrieveFeedTask extends AsyncTask<String, String, String> {
protected String doInBackground(String...Urls) {
try {
HttpURLConnection urlConnection = null;
URL myUrl = new URL("http://10.0.2.2:80/mob1/Default.aspx");
urlConnection = (HttpURLConnection)myUrl.openConnection();
BufferedReader in = new BufferedReader (new InputStreamReader(urlConnection.getInputStream()));
String temp = "";
while ((temp=in.readLine()) != null) {
DataCollector(temp);
}
if (urlConnection != null) {
urlConnection.disconnect();
}
}
catch (Exception e) {
Log.d("error",e.toString());
return "1";
}
return "1";
}
protected void onPostExecute(String Result) {
//
}
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new RetrieveFeedTask().execute();
Spliter();
CreateUI();
}
}
我清理了你的代码并修复了一系列问题 永远不要使用固定循环,始终以其最大长度在阵列上循环。否则你就是自找麻烦。
只声明Button变量一次,并根据需要更改其值。 您不需要临时或DD,您可以在一行中完成 我创建了SplitData,并用一些您希望看到的数据填充它 我还修改了您的代码样式,使其可读。在发布代码之前,您应该认真考虑清理代码: 这将生成10个相互下方的按钮,其中包含来自SplitData的文本 布局: 一旦创建: 截图: 这里的第一个问题是,您不必等到RetrieveFeedTask的执行结束后才创建ui。因此,您将在空数据上构建ui 解决方案:使用onPostExecute操作数据(即拆分器)并绘制ui(即CreateUI) 您的下一个问题可能是:
while((temp=in.readLine())!=null)
{
DataCollector(temp);
}
这是一段非常奇怪的代码:它将用接收到的最后一行替换局部变量WebData。我不知道你为什么这么做
第三个问题:
IMHO,如果您想在这里发布代码时获得更好的响应:请尝试使其更具可读性,并遵循基本的java代码样式约定,如以下约定:实例变量和区域设置变量以小写开头
同时尝试为变量使用更明确的名称:DD没有意义,请使用按钮而不是B 什么是拆分数据[]?不,不是!!这是一个数组,它有数据,我使用这个数据!它有什么数据,即SplitData数组?只需声明Button变量一次,并根据需要更改其值,否则垃圾收集器将不得不对您忽略的所有变量疯狂运行。我很想看到你对此的详细阐述。你不需要临时或DD,你可以在一行中完成,不为变量保留内存是的,这确实是一个主要的内存缺陷。。。不,不是真的。只需声明一次Button变量,并根据需要更改其值,否则垃圾收集器将不得不对您忽略的所有变量执行疯狂操作。这是胡说八道。你不需要temp或DD,你可以在一行中完成它,而不为变量保留内存尽管它们确实是不必要的,不使用它们更干净,使用变量不会影响内存使用。如果你纠正他的代码风格,然后你也可以纠正他的命名方式。@show-p1984你可能想读一下:这是关于你的第二点。没有理由通过将变量移出循环来增加变量范围。
//fill SplitData
String[] SplitData = new String [10];
for (int i = 0; i < SplitData.length; i++)
SplitData[i] = "Button" + i + "/other/stuff";
//your original code, cleaned
Button b = null;
String BtnText = "";
LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
for (String aSplitData : SplitData) {
BtnText = aSplitData.split("/")[0];
b = new Button(this);
b.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10);
b.setText(BtnText);
ll.addView(b);
}
while((temp=in.readLine())!=null)
{
DataCollector(temp);
}