Java 如何使用onResponse json函数更改android片段中的公共字符串值
我试图从我的SQL数据库中获取页面文本,并在Android片段的TextView中显示它 我得到了数据,但当我试图将其解析为公共字符串时,结果为空 我创建了公共字符串pageText和uset setText(pageText),并尝试将json文本解析为pageText,但结果为空,并且没有在TextView中显示页面文本 这是我的密码:Java 如何使用onResponse json函数更改android片段中的公共字符串值,java,android,android-fragments,Java,Android,Android Fragments,我试图从我的SQL数据库中获取页面文本,并在Android片段的TextView中显示它 我得到了数据,但当我试图将其解析为公共字符串时,结果为空 我创建了公共字符串pageText和uset setText(pageText),并尝试将json文本解析为pageText,但结果为空,并且没有在TextView中显示页面文本 这是我的密码: package per.mikha.programs.medjobs.ui.home; import android.app.VoiceInteract
package per.mikha.programs.medjobs.ui.home;
import android.app.VoiceInteractor;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
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.JsonObjectRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Text;
import java.io.IOException;
import java.lang.reflect.Method;
import per.mikha.programs.medjobs.R;
public class HomeFragment extends Fragment {
private HomeViewModel homeViewModel;
public String pageText;
public final String GET_BY_ID = "https://xxxxxx.com/mekha.php?id=";
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
homeViewModel =
new ViewModelProvider(this).get(HomeViewModel.class);
View root = inflater.inflate(R.layout.fragment_home, container, false);
final TextView textView = root.findViewById(R.id.text_home);
getData("1");
textView.setText(pageText);
//Toast.makeText(getContext(),pageText,Toast.LENGTH_LONG).show();
/*homeViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
textView.setText(s);
}
});*/
return root;
}
public void getData(String id){
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, GET_BY_ID+id, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
String title = response.getString("title");
String theText = response.getString("text");
pageText=theText;
//Toast.makeText(getContext(),theText,Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(getContext(),e.getMessage(),Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getContext(),error.getMessage(),Toast.LENGTH_LONG).show();
}
});
RequestQueue requestQuere = Volley.newRequestQueue(getContext());
requestQuere.add(request);
}
}
package per.mikha.programs.medjobs.ui.home;
导入android.app.voiceinteractior;
导入android.os.Bundle;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.webkit.WebView;
导入android.widget.TextView;
导入android.widget.Toast;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.fragment.app.fragment;
导入androidx.lifecycle.Observer;
导入androidx.lifecycle.ViewModelProvider;
导入com.android.volley.Request;
导入com.android.volley.RequestQueue;
导入com.android.volley.Response;
导入com.android.volley.VolleyError;
导入com.android.volley.toolbox.JsonObjectRequest;
导入com.android.volley.toolbox.StringRequest;
导入com.android.volley.toolbox.volley;
导入org.json.JSONException;
导入org.json.JSONObject;
导入org.w3c.dom.Text;
导入java.io.IOException;
导入java.lang.reflect.Method;
根据.mikha.programs.medjobs.R导入;
公共类HomeFragment扩展了片段{
私有HomeViewModel HomeViewModel;
公共字符串页面文本;
公共最终字符串GET_BY_ID=”https://xxxxxx.com/mekha.php?id=";
公共视图onCreateView(@NonNull layoutiner充气机,
视图组容器,捆绑包savedInstanceState){
homeViewModel=
新建ViewModelProvider(this.get)(HomeViewModel.class);
视图根=充气机。充气(R.layout.fragment\u home,container,false);
final TextView TextView=root.findviewbyd(R.id.text\u home);
getData(“1”);
textView.setText(页面文本);
//Toast.makeText(getContext(),pageText,Toast.LENGTH_LONG).show();
/*homeViewModel.getText().observe(getViewLifecycleOwner(),new Observer()){
@凌驾
公共void onChanged(@Nullable String s){
textView.setText;
}
});*/
返回根;
}
public void getData(字符串id){
JsonObjectRequest=newJSONObjectRequest(request.Method.GET,GET_BY_ID+ID,null,new Response.Listener()){
@凌驾
公共void onResponse(JSONObject响应){
试一试{
String title=response.getString(“title”);
String theText=response.getString(“文本”);
pageText=文本;
//Toast.makeText(getContext(),theText,Toast.LENGTH_LONG.show();
}捕获(JSONException e){
e、 printStackTrace();
Toast.makeText(getContext(),e.getMessage(),Toast.LENGTH_LONG.show();
}
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
Toast.makeText(getContext(),error.getMessage(),Toast.LENGTH_LONG.show();
}
});
RequestQueue requestQuere=Volley.newRequestQueue(getContext());
requestQuere.add(请求);
}
}
让我们把它分开:
final TextView textView = root.findViewById(R.id.text_home);
getData("1");
textView.setText(pageText);
当调用setText
时,您会说pageText是null
。让我们看看getData
的作用:
public void getData(String id){
JsonObjectRequest request =
new JsonObjectRequest(
Request.Method.GET, GET_BY_ID+id, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
String title = response.getString("title");
String theText = response.getString("text");
pageText = theText;
} catch (JSONException e) {
// ...
}
}
},
new Response.ErrorListener() {
// ...
}
);
RequestQueue requestQueue = Volley.newRequestQueue(getContext());
requestQueue.add(request);
}
很可能对请求的响应尚未到达,并且pageText
尚未设置。哎呀
但我认为您不能等待响应后再从
getData
返回。这将阻塞UI线程。因此,我认为您需要做的是将调用textView.setText
的代码放入响应侦听器的onResponse
方法中。删除pagetext变量并设置textView on response出于您的目的,“getData”方法必须同步工作。但您的代码不是。若要确保正确工作,请将“getData”方法修改为同步工作,或在“onResponse”方法之后调用“setText”方法
textView.setText(pageText);