Android Studio中如何根据API返回数量动态创建按钮?
解决方案:直接在
onPostExecute()中动态创建按钮 当然可以在onPostExecute()方法里直接声明并创建按钮,这才是更高效、灵活的做法——完全不需要预先创建50个按钮的数组,既浪费内存,还可能出现数组越界的问题。
核心思路
你不需要提前知道按钮数量,因为当onPostExecute()拿到API返回的完整数据后,已经能通过games.length()获取到当日对阵的数量,此时再按需创建对应数量的按钮即可。
修改后的完整代码
public class ChooseMatchupActivity extends AppCompatActivity { // 移除预先声明的按钮数组,不需要了! private LinearLayout ll; private LinearLayout.LayoutParams lp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_choose_matchup); String apiFeedUrl = "https://api.somesportssite.com/pull/current/daily_game_schedule.json?fordate=20180113"; ll = findViewById(R.id.matchup_layout); lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); // 直接发起API请求即可,不用提前创建按钮 new RetrieveFeedTask().execute(apiFeedUrl); } class RetrieveFeedTask extends AsyncTask<String, Void, String> { protected void onPreExecute() {} protected String doInBackground(String... urls) { String url = urls[0]; String response = null; try { URLConnection connection = new URL(url).openConnection(); InputStreamReader streamReader = new InputStreamReader(connection.getInputStream()); BufferedReader in = new BufferedReader(streamReader); StringBuilder stringBuilder = new StringBuilder(); String line; while ((line = in.readLine()) != null) { stringBuilder.append(line).append("\n"); } response = stringBuilder.toString(); } catch (IOException e) { e.printStackTrace(); } return response; } protected void onPostExecute(String response) { /* 获取所有对阵信息并动态创建按钮 */ try{ JSONObject obj = new JSONObject(response); JSONArray games = obj.getJSONObject("dailygameschedule").getJSONArray("gameentry"); // 循环创建按钮,数量完全匹配API返回的对阵数 for (int i = 0; i < games.length(); i++){ String awayTeam = games.getJSONObject(i).getJSONObject("awayTeam").getString("Name"); String homeTeam = games.getJSONObject(i).getJSONObject("homeTeam").getString("Name"); String matchUpStr = awayTeam + "\n" + homeTeam; // 在这里创建单个按钮并配置属性 Button matchupBtn = new Button(ChooseMatchupActivity.this); matchupBtn.setTextSize(30); matchupBtn.setGravity(Gravity.START); matchupBtn.setText(matchUpStr); // 添加到布局 ll.addView(matchupBtn, lp); } } catch (JSONException e) { e.printStackTrace(); } } } }
关键修改点说明
- 移除了冗余的
Button matchupButtons[]数组,避免不必要的内存占用。 - 将按钮的创建、配置逻辑移到
onPostExecute()的循环中,每遍历一个对阵信息就创建一个对应按钮,数量完全匹配实际需求。 - 修复了
doInBackground()中未捕获IOException的问题(原代码会编译报错)。
额外提示
如果后续需要对这些按钮做统一操作(比如批量设置点击事件),可以在onPostExecute()中把创建的按钮存入一个List<Button>集合中,而不是固定长度的数组,这样更灵活。
内容的提问来源于stack exchange,提问作者Slaknation
相关产品推荐
相关产品推荐

