Saya mencoba mendapatkan teks halaman dari database SQL saya dan menampilkannya di TextView di Android Fragment.

Saya mendapatkan datanya, tetapi ketika saya mencoba menguraikannya ke string publik, hasilnya adalah NULL.

Saya membuat String pageText publik dan menggunakan setText(pageText), dan mencoba mengurai teks json ke pageText tetapi hasilnya kosong dan tidak menampilkan teks halaman di TextView

Ini kode saya:

 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);
}
}
0
Mikha Matta 4 Januari 2021, 01:25

3 jawaban

Jawaban Terbaik

Mari kita pilih ini:

    final TextView textView = root.findViewById(R.id.text_home);

    getData("1");
    textView.setText(pageText);

Dan Anda mengatakan bahwa pageText adalah null ketika setText dipanggil. Jadi mari kita lihat apa yang getData lakukan:

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);
}

Jadi ... getData menyiapkan permintaan dengan pendengar respons dan penangan kesalahan, menambahkannya ke antrean permintaan lalu segera kembali.

Beberapa waktu kemudian, permintaan dikirim dan tanggapan diterima. Kemudian metode onResponse dipanggil, JSON diuraikan dan pageText disetel ke nilai (mungkin) bukan nol.

Tapi inilah masalahnya. Segera setelah panggilan getData kembali, penelepon melakukan ini:

    textView.setText(pageText);

Kemungkinan tanggapan atas permintaan belum tiba, dan pageText belum ditetapkan. Ups.

Tapi saya rasa Anda tidak akan bisa menunggu tanggapan sebelum kembali dari getData. Itu akan memblokir utas UI. Jadi yang saya pikir perlu Anda lakukan adalah memasukkan kode yang memanggil textView.setText ke dalam metode onResponse pendengar respons.

0
Stephen C 4 Januari 2021, 03:23

Hapus variabel teks halaman dan atur tampilan teks pada respons

1
faysal neowaz 4 Januari 2021, 07:41

Untuk maksud Anda, metode 'getData' harus bekerja secara sinkron. Tapi kode Anda tidak.
Untuk memastikan berfungsi dengan benar, Ubah metode 'getData' agar berfungsi tersinkronisasi atau Panggil metode 'setText' setelah metode 'onResponse'.

0
Kooin-Shin 4 Januari 2021, 07:59