Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我想在android中动态创建按钮时,为什么我的应用程序不工作?_Java_Android - Fatal编程技术网

Java 当我想在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("

我正在开发一个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("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);            
        }