简体   繁体   中英

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>



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!

You're trying to reference a view that belongs to the activity. If you want to update something in the activity you need to look at other methods rather than trying to directly reference the views.

A good place to start would be an interface you pass to the fragment that is created by the activity. Call the interface method from the fragment when you want to set the next. Then let the activity handle the updating. This is cleaner too as each view is responsible for its own elements only.

You also don't need to use runOnUIThread as onViewCreated isn't an ansychronos function you're already on the UI thread anyway.

Hopefully that helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM