我试图通过调用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>
您正在尝试引用属于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