Search code examples
javaandroiduser-interfacetextview

Failing at updating a TextView with Android Emulator


I'm trying to update a TextView object's text by calling the setText() method. I provide a string value directly to it, but I can't get it to update on the UI of the app running on the Emulator.

This is taking place on a fragment (one of the fragments automatically generated when a project with a simple activity is created on Android Studio)

A couple points about my situation thus far:

  • I tried calling the setText() method with the runOnUiThread "pattern" to no avail.

    getActivity().runOnUiThread(new Runnable() 
    {
        @Override
        public void run() 
        {
            textView.setText("Service online");
        }
    });
    
    
  • I checked property mText of the TextView instance. It IS UPDATED. It just doesn't update on the UI :/

In short, no matter what I try to do, the UI element sticks to whatever string value is set on the XML Fragment file (or no value, if I delete the android:text attribute). Other posts on Stack Overflow similar to this issue did not help me either. Any idea what it could be?

Also, I'm posting the entire fragment related java code:

public class FirstFragment extends Fragment
{
    public Gson serializer;
    public TextView textView;

    private NetworkManager networkManager;
    private boolean serviceIsBound;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState)
    {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_first, container, false);
        textView = (TextView) view.findViewById(R.id.main_window);
        textView.setText(R.string.app_name);

        return inflater.inflate(R.layout.fragment_first, container, false);
    }

    @Override
    public void onStart() {
        super.onStart();

        Intent bindIntent = new Intent(getActivity(), NetworkManager.class);
        getActivity().bindService(bindIntent, serviceConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    public void onStop()
    {
        super.onStop();
        getActivity().unbindService(serviceConnection);
        serviceIsBound = false;
    }

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        view.findViewById(R.id.button_first).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.v("DEV UPDATE", "Starting Request ");

                if (serviceIsBound)
                {
                    GetAPIStatusResult result = networkManager.GetAPIStatus();
                    if (result.GetStatus())
                    {
                        Log.v("REQUEST RESULT", "API is Fine");

                        getActivity().runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                textView.setText("Service online");

                            }
                        });
                    }
                    else
                    {
                        Log.v("REQUEST RESULT", "API is Down or a problem occurred");
                        textView.setText("Service down");
                    }
                }
            }
        });
    }

    private ServiceConnection serviceConnection = new ServiceConnection()
    {
        @Override
        public void onServiceConnected(ComponentName className, IBinder service)
        {
            NetworkManager.NetworkManagerServiceBinder binder = (NetworkManager.NetworkManagerServiceBinder) service;
            networkManager = binder.GetService();
            serviceIsBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName arg)
        {
            serviceIsBound = false;
        }
    };
}

The associated XML for the fragment:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FirstFragment">

    <TextView
        android:id="@+id/main_window"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Here will appear API status"
        app:layout_constraintBottom_toTopOf="@id/button_first"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button_first"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="SendRequest"
        android:text="@string/SendRequest"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/main_window" />

    </androidx.constraintlayout.widget.ConstraintLayout>




Solution

  • As user Cheticamp commented, I had an issue on my onCreateView() method, where I was calling the infalter.inflate() method twice, and not returning my view object.

    I replaced the second inflate() method call with a return of my view object and it immediately worked! My UI was now being updated as expected!