编程初学者求助:如何点击按钮从PHP链接获取数据显示到TextView
嘿,作为编程初学者遇到这个问题太正常啦!我来帮你一步步实现这个需求,不用纠结之前那个没效果的库,咱们用更稳定、常用的方法来做~
第一步:配置必要的权限和网络设置
首先得让你的App能访问网络,还要处理明文HTTP请求的问题(因为你的接口是http开头的,Android 9+默认禁止明文请求):
添加网络权限
打开AndroidManifest.xml,在<manifest>标签里(<application>外面)添加:<uses-permission android:name="android.permission.INTERNET" />允许明文HTTP请求
- 在
res/xml目录下新建network_security_config.xml文件,内容如下:<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config> - 回到
AndroidManifest.xml,给<application>标签加上这个配置:<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application>
- 在
第二步:用Volley实现网络请求(新手友好)
Volley是Google推荐的轻量级网络库,适合这种简单的Get请求,上手很快:
添加Volley依赖
打开你的Module级别的build.gradle(通常是app/build.gradle),在dependencies里添加:implementation 'com.android.volley:volley:1.2.1'然后点击Sync Now同步依赖。
编写布局文件
打开activity_main.xml,添加一个按钮和一个用于显示结果的TextView:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> <Button android:id="@+id/fetch_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="获取数据" /> <TextView android:id="@+id/result_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:textSize="18sp" /> </LinearLayout>编写MainActivity逻辑
打开MainActivity.java,实现按钮点击监听和网络请求:import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; public class MainActivity extends AppCompatActivity { private TextView resultTv; private RequestQueue requestQueue; private static final String API_URL = "http://sbms.atwebpages.com/SB/test.php?id=5"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); resultTv = findViewById(R.id.result_tv); Button fetchBtn = findViewById(R.id.fetch_btn); // 初始化Volley请求队列 requestQueue = Volley.newRequestQueue(this); fetchBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 创建StringRequest,发起Get请求 StringRequest stringRequest = new StringRequest(Request.Method.GET, API_URL, new Response.Listener<String>() { @Override public void onResponse(String response) { // 请求成功,把返回的内容设置到TextView resultTv.setText("返回数据:" + response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 请求失败,显示错误信息 resultTv.setText("请求失败:" + error.getMessage()); } }); // 将请求加入队列 requestQueue.add(stringRequest); } }); } }
备选方案:用OkHttp实现
如果你想试试另一个常用的网络库OkHttp,步骤也很简单:
添加OkHttp依赖
在app/build.gradle的dependencies里添加:implementation 'com.squareup.okhttp3:okhttp:4.10.0'修改MainActivity的点击逻辑
替换Volley的部分为OkHttp代码(注意要开异步线程):import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import java.io.IOException; // ... 其他代码不变,替换按钮点击逻辑部分 fetchBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(API_URL) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 请求失败,在主线程更新UI runOnUiThread(new Runnable() { @Override public void run() { resultTv.setText("请求失败:" + e.getMessage()); } }); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { final String responseData = response.body().string(); // 请求成功,在主线程更新UI runOnUiThread(new Runnable() { @Override public void run() { resultTv.setText("返回数据:" + responseData); } }); } } }); } });
为什么之前的库没效果?
那个第三方库可能很久没维护了,或者配置步骤里有遗漏(比如权限、网络设置没配好),用官方推荐的Volley或者主流的OkHttp会更靠谱,遇到问题也更容易找到解决方案。
现在你可以运行App试试,点击按钮就能看到返回的25,25啦!
内容的提问来源于stack exchange,提问作者Abdullah

