当前位置: 首页 > 知识库问答 >
问题:

使用Android模拟器更新TextView失败

罗法
2023-03-14

我试图通过调用setText()方法更新TextView对象的文本。我直接向它提供了一个字符串值,但我无法让它在运行在仿真器上的应用程序的UI上更新。

这是发生在一个片段上(在Android Studio上创建带有简单activity的项目时自动生成的片段之一)

关于我目前的情况,有几点:

>

  • 我尝试用runOnUiThread“pattern”调用setText()方法,但没有成功。

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

    我检查了TextView实例的属性mText。它是更新的。它只是在UI上不更新:/

    简而言之,无论我尝试做什么,UI元素都坚持XML片段文件上设置的任何字符串值(或者没有值,如果我删除了android:text属性)。其他类似于这个问题的关于堆栈溢出的帖子也没有帮助我。知道可能是什么吗?

    另外,我还贴出了整个片段相关的Java代码:

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

    片段的关联XML:

    <?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>
    
    
    
    
  • 共有1个答案

    彭兴朝
    2023-03-14

    您正在尝试引用属于activity的视图。如果您想更新activity中的内容,您需要查看其他方法,而不是尝试直接引用视图。

    一个很好的开始是传递给activity创建的片段的接口。当要设置下一个时,从片段中调用接口方法。然后让activity来处理更新。这也更简洁,因为每个视图只对其自身的元素负责。

    您也不需要使用runonuithread,因为onviewcreated不是ansychronos函数您已经在UI线程上了。

    希望能有所帮助。

     类似资料:
    • 更新Android Studio 4.2.2后,模拟器突然停止工作。 尝试了一切,删除和重新安装模拟器,甚至重新安装Android Studio。降级Android Studio再次升级Android Studio。什么都不管用。现在,如果我尝试运行模拟器,它会说:

    • 问题内容: 我正在使用计时器来创建秒表。计时器通过增加整数值来工作。然后,我想通过不断更新textview在活动中显示此值。 这是我在服务中尝试更新活动的textview的代码: 我在错误的线程中更新UI时遇到某种错误。 如何调整我的代码以完成不断更新textview的任务? 问题答案: 上面的代码可以工作… 注意:必须在您的主线程中创建处理程序,以便您可以修改UI内容。

    • 我已经通过标准更新通道将android Studio更新到3.0。更新后无法启动模拟器。 我试过以下方法。但没有任何效果。 > < li> 重新启动并重新安装HAXM安装程序。 重新启动并重新安装 AVD 管理器。 从终端启动仿真器。 将内存大小更改为2GB。 图形到软件GLES 2.0 PFB圆木。 4点钟,跑步 AT Gradle控制台: 系统配置: 苹果电脑专业版 2016 操作系统:Hig

    • 我对哈克斯姆有意见。在我使用Windows7之前,一切都很好,但升级到Win8.1 Pro后,当我从AVD屏幕上启动模拟器时,我看不到haxm启动消息。HAXM已经安装并运行良好,我安装了x86的映像,我的设备使用它,但仍然不能在启动窗口中看到模拟器正在使用HAXM的确认消息。 null

    • 我对Android Studio有一个问题,当我在事件日志信息上运行AVD时,它总是说 11:17模拟器:VK_VERSION_1_1检查失败:找不到vkBindBufferMemory2 11:17模拟器:VK_VERSION_1_1检查失败:找不到vkBindImageMemory2 11:17模拟器:VK_VERSION_1_1检查失败:找不到vkGetImageSparseMemoryRe