可扩展标记语言(XML)是一种灵活的结构化文档格式,用于定义人类和机器可读的编码规则。
我读过有关此问题的各种内容,所以我希望能对其进行明确的排序。 如果我有内嵌在 HTML 文档中的 SVG 标记,并且我使用 CSS 对其进行样式设置,我是否需要包装该 CSS...
希望 recyclerview 在创建活动时从下到上开始,并在添加新项目时再次在底部滚动
我的 Android 应用程序中有一个名为 ChatActivity 的活动。这是 xml 布局: 我的 Android 应用程序中有一个名为 ChatActivity 的活动。这是 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:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:windowSoftInputMode="adjustResize" tools:context=".ui.home.ui.chat.ChatActivity"> <com.google.android.material.appbar.MaterialToolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:navigationIcon="?attr/homeAsUpIndicator" app:navigationIconTint="@color/black" app:title="@string/chat" app:titleCentered="true" > <de.hdodenhof.circleimageview.CircleImageView android:id="@+id/ivProfile" android:layout_width="@dimen/_30sdp" android:layout_height="@dimen/_30sdp" android:src="@drawable/ic_dummy_user" android:layout_marginHorizontal="@dimen/_10sdp" android:layout_gravity="end" /> </com.google.android.material.appbar.MaterialToolbar> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rvMessages" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@id/toolbar" android:paddingBottom="@dimen/_95sdp" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintVertical_bias="1.0" tools:listitem="@layout/item_message_sent" /> <com.google.android.material.textfield.TextInputLayout android:id="@+id/tiMessage" style="@style/textInputLayout" android:layout_width="0dp" android:layout_height="wrap_content" android:maxHeight="@dimen/_200sdp" android:layout_marginLeft="@dimen/_5sdp" android:layout_marginRight="@dimen/_35sdp" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" app:errorEnabled="false" android:layout_marginVertical="@dimen/_5sdp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" > <com.google.android.material.textfield.TextInputEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:maxHeight="@dimen/_200sdp" android:autofillHints="name" android:hint="@string/message" android:inputType="textMultiLine" /> </com.google.android.material.textfield.TextInputLayout> <ImageView android:id="@+id/ivSend" android:layout_width="@dimen/_25sdp" android:layout_height="@dimen/_25sdp" android:src="@drawable/ic_send_message" app:layout_constraintRight_toRightOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginBottom="@dimen/_12sdp" app:layout_constraintLeft_toRightOf="@id/tiMessage" app:tint="@color/blue" /> </androidx.constraintlayout.widget.ConstraintLayout> 当我打开 textInput 字段时,布局不适应它,它仅显示要打开的键盘,但是当我在键盘中键入时,它确实会在文本输入布局中键入,但在键入时用户无法看到文本输入布局。关闭键盘 + 回收视图开始从上到下滚动,但我希望它像聊天一样,从下到上。在添加的新消息上,它确实滚动到底部,但在现有列表的最后一项上,而不是在新项目上。 我尝试过使用 android:windowSoftInputMode="adjustResize" 作为键盘和 private fun scrollToBottom() { binding.rvMessages.scrollToPosition(adapter.itemCount -1) } 用于回收视图。 欢迎任何优化代码/改进的建议。我的活动代码是: @AndroidEntryPoint class ChatActivity : AppCompatActivity() { private lateinit var binding: ActivityChatBinding private lateinit var database: DatabaseReference private lateinit var adapter: ChatAdapter private var currentUserId: Int = 0 private var otherUserId: Int = 0 private lateinit var conversationId: String private var convoId = "" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() binding = ActivityChatBinding.inflate(layoutInflater) setContentView(binding.root) ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } binding.toolbar.setNavigationOnClickListener { onBackPressedDispatcher.onBackPressed() } val userDetails = intent.getParcelableExtra<ConnectionDetailDTO>("USER_DETAILS") val currentUser = Paper.book().read<User>(Constant.k_user) currentUserId = currentUser?.id!! otherUserId = userDetails?.id!! binding.toolbar.title = userDetails.name Glide.with(this).load(userDetails.profileUrl).placeholder(R.drawable.ic_dummy_user).into(binding.ivProfile) binding.ivProfile.setOnClickListener{showProfile()} adapter = ChatAdapter(currentUserId) binding.rvMessages.layoutManager = LinearLayoutManager(this) binding.rvMessages.adapter = adapter scrollToBottom() val database = FirebaseDatabase.getInstance() val reference = database.getReference("Conversations") reference.addValueEventListener(object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { val messages = mutableListOf<Message>() for (conversationSnapshot in dataSnapshot.children) { val conversationIdParts = conversationSnapshot.key?.split("_") if (conversationIdParts?.size == 3) { val firstUserId = conversationIdParts[1] val secondUserId = conversationIdParts[2] convoId = "conversation_${firstUserId}_${secondUserId}" if (firstUserId == currentUserId.toString() && secondUserId == otherUserId.toString() || firstUserId == otherUserId.toString() && secondUserId == currentUserId.toString()) { val conversationMessages = mutableListOf<Message>() for (messageSnapshot in conversationSnapshot.child("messages").children) { val content = messageSnapshot.child("content").value.toString() val date = messageSnapshot.child("date").value.toString() val messageId = messageSnapshot?.child("id")?.value.toString() val isRead = messageSnapshot.child("isRead").value as? Boolean ?: false val name = messageSnapshot.child("name").value.toString() val senderEmail = messageSnapshot.child("senderEmail").value.toString() val type = messageSnapshot.child("type").value.toString() val message = Message(content, date, messageId, isRead, name, senderEmail, type) conversationMessages.add(message) Log.d(TAG, "onDataChange: $message") } messages.addAll(conversationMessages) } } } Log.d(TAG, "onDataChange: $messages") adapter.updateMessages(messages) } override fun onCancelled(databaseError: DatabaseError) { println("Error: ${databaseError.message}") } }) binding.ivSend.setOnClickListener { val messageText = binding.tiMessage.editText?.text.toString().trim() if (messageText.isNotEmpty()) { val conversationId1 = "conversation_${currentUserId}_${otherUserId}" val conversationId2 = "conversation_${otherUserId}_${currentUserId}" reference.child(conversationId1).get().addOnCompleteListener { task -> if (task.isSuccessful) { val data = task.result?.value val conversationId = if (data != null) { conversationId1 } else { conversationId2 } val messageReference = reference.child(conversationId).child("messages").push() val message = Message( content = messageText, date = SimpleDateFormat( "yyyy-MM-dd HH:mm:ss", Locale.getDefault() ).format(Date()), id = messageReference.key!!, isRead = false, name = currentUser?.name ?: "", senderEmail = currentUserId.toString(), type = "text" ) messageReference.setValue(message) binding.tiMessage.editText?.setText("") scrollToBottom() } } addUser(currentUserId.toString()) } } } private fun scrollToBottom() { binding.rvMessages.scrollToPosition(adapter.itemCount -1) } } 我尝试了 StackOverFLow 和 Chat GPT 的回收器视图解决方案 回收视图开始从上到下滚动,但我希望它是 就像聊天一样,从下到上。添加新消息后,它会滚动到 底部,但在现有列表的最后一项上,而不是在新项目上。 我尝试过使用.. recyclerView 从顶部开始并且不会在新项目上滚动到底部的原因是因为您在将项目添加到适配器之前调用了scrollToBottom()。 删除scrollToBottom()中的binding.ivSend.setOnClickListener{}并将其添加到adapter.updateMessages(messages)下面 Log.d(TAG, "onDataChange: $messages") adapter.updateMessages(messages) scrollToBottom() 这样,当首次从数据库加载项目以及添加新项目时,回收器视图将向下滚动。 为了更容易阅读代码,我建议您将代码排序到方法中,而不是将所有内容都放在 override fun onCreate(savedInstanceState: Bundle?) {} 中。 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() binding = ActivityChatBinding.inflate(layoutInflater) setContentView(binding.root) ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } setArgs() setupUI() setupDatabase() setupListeners() } private fun setArgs(){ userDetails = intent.getParcelableExtra<ConnectionDetailDTO>("USER_DETAILS") currentUser = Paper.book().read<User>(Constant.k_user) } private fun setupUI(){ //toolbar binding.toolbar.setNavigationOnClickListener { onBackPressedDispatcher.onBackPressed() } binding.toolbar.title = userDetails.name Glide.with(this).load(userDetails.profileUrl).placeholder(R.drawable.ic_dummy_user).into(binding.ivProfile) binding.ivProfile.setOnClickListener{showProfile()} //recycler view adapter = ChatAdapter(currentUser.id) binding.rvMessages.layoutManager = LinearLayoutManager(this) binding.rvMessages.adapter = adapter } private fun setupDatabase(){ database = FirebaseDatabase.getInstance() reference = database.getReference("Conversations") } private fun setupListeners(){ reference.addValueEventListener(object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { val messages = mutableListOf<Message>() for (conversationSnapshot in dataSnapshot.children) { val conversationIdParts = conversationSnapshot.key?.split("_") if (conversationIdParts?.size == 3) { val firstUserId = conversationIdParts[1] val secondUserId = conversationIdParts[2] convoId = "conversation_${firstUserId}_${secondUserId}" if (firstUserId == currentUser.id.toString() && secondUserId == currentUser.id.toString() || firstUserId == userDetails.id.toString() && secondUserId == currentUser.id.toString()) { val conversationMessages = mutableListOf<Message>() for (messageSnapshot in conversationSnapshot.child("messages").children) { val content = messageSnapshot.child("content").value.toString() val date = messageSnapshot.child("date").value.toString() val messageId = messageSnapshot?.child("id")?.value.toString() val isRead = messageSnapshot.child("isRead").value as? Boolean ?: false val name = messageSnapshot.child("name").value.toString() val senderEmail = messageSnapshot.child("senderEmail").value.toString() val type = messageSnapshot.child("type").value.toString() val message = Message(content, date, messageId, isRead, name, senderEmail, type) conversationMessages.add(message) Log.d(TAG, "onDataChange: $message") } messages.addAll(conversationMessages) } } } Log.d(TAG, "onDataChange: $messages") adapter.updateMessages(messages) } override fun onCancelled(databaseError: DatabaseError) { println("Error: ${databaseError.message}") } }) binding.ivSend.setOnClickListener { val messageText = binding.tiMessage.editText?.text.toString().trim() if (messageText.isNotEmpty()) { val conversationId1 = "conversation_${currentUser.id}_${userDetails.id}" val conversationId2 = "conversation_${userDetails.id}_${currentUser.id}" reference.child(conversationId1).get().addOnCompleteListener { task -> if (task.isSuccessful) { val data = task.result?.value val conversationId = if (data != null) { conversationId1 } else { conversationId2 } val messageReference = reference.child(conversationId).child("messages").push() val message = Message( content = messageText, date = SimpleDateFormat( "yyyy-MM-dd HH:mm:ss", Locale.getDefault() ).format(Date()), id = messageReference.key!!, isRead = false, name = currentUser?.name ?: "", senderEmail = currentUser.id.toString(), type = "text" ) messageReference.setValue(message) binding.tiMessage.editText?.setText("") scrollToBottom() } } addUser(currentUser.id.toString()) } } } 最后我建议您阅读 MVVM 设计模式以获取更多代码结构。
我有代码创建一个新的XMLHttpRequest来更改元素的innerhtml以切换页面。然而,我意识到简单地改变 insidehtml 的效果是完全相同的。所以我很奇怪...
Powershell 创建多达 50k xml 文件最终导致内存泄漏
我必须循环遍历一个包含最多 58k 行的 csv 文件。每行有 60 个分号分隔的值。 我必须为每一行创建一个 xml 文件。我的脚本正在做我期望的事情......
<ImageButton android:id="@+id/backbutton" android:layout_width="65dp" android:layout_height="50dp" android:layout_gravity="center" app:layout_constraintLeft_toRightOf="parent" app:srcCompat="@drawable/backarrow"/> 我收到了此代码,但按钮上的图像显得太大,以至于剪切了照片的某些部分。我只想知道是否有任何方法可以减少背景的宽度和高度? 我已经尝试过android:scaleType="fitCenter"但没有成功 嗨,转到名为“backarrow”的 xml 文件。您是否尝试过更改其中的测量参数?我举了下面的例子。 <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"> <path android:fillColor="#ffffff" android:pathData="M12.5,5A7.5,7.5 0 0,0 5,12.5A7.5,7.5 0 0,0 12.5,20A7.5,7.5 0 0,0 20,12.5A7.5,7.5 0 0,0 12.5,5M7,10H9A1,1 0 0,1 10,11V12C10,12.5 9.62,12.9 9.14,12.97L10.31,15H9.15L8,13V15H7M12,10H14V11H12V12H14V13H12V14H14V15H12A1,1 0 0,1 11,14V11A1,1 0 0,1 12,10M16,10H18V11H16V14H18V15H16A1,1 0 0,1 15,14V11A1,1 0 0,1 16,10M8,11V12H9V11" /> 如果这里的高度和宽度对您没有帮助,您可以尝试视口的。
为什么我的卡片视图在 Android Studio 中超出了整个宽度?
我正在使用此卡片视图(蓝色)和回收器视图中的另一个卡片视图来显示发送和接收的消息。 但是卡片视图(蓝色)覆盖了整个宽度,正如您在图片中看到的那样,我无法...
ElementNSImpl 类型的对象为 com.sun.org.apache.xerces.internal.dom.ElementNSImpl
所以我部署在 JDK1.8.0_161 环境上的 WS-Trust 服务器正在等待一个包含 org.apache.xerces.dom.ElementNSImpl 类型的 xml 节点的请求,但是当请求到来时,节点......
在具有约束布局的 AlertDialog 中使用时,回收器视图布局宽度很奇怪
我正在尝试在 AlertDialog 中使用回收器视图。 我希望回收器视图占据 AlertDialog 宽度的 100%。 我使用这个xml代码 ...
无法加载文件或程序集“DocumentFormat.OpenXml
我一直收到这个错误是VS2013 无法加载文件或程序集“DocumentFormat.OpenXml,Version=2.0.5022.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”或其依赖项之一。 在...
我搜索了又搜索,似乎找不到任何关于如何编写我自己的严格 XML 网页的教程。这就是我想自己创造的东西。我对 XML 不太了解...
在 Android Studio 中,我创建了一个新的 Kotlin 活动和一个与之配套的 .xml 文件。我知道在 xml 文件中包含硬编码文本是不好的,您应该使用这个答案来引用字符串资源
Lorem ipsum dolor sat amet,consectetur adipiscing elit。 Praesent quis aliquam Massa。 Vivamus id ullamcorper odio,nec placerat urna。 Nam vitae ante efficitur, varius sapien a, sodales nibh.中间...
如何使用 ElementTree 从 xml 中提取 python 中“xml:id”的值到数据框中
我目前正在将书目信息从 XML 结构整理为几乎任何其他可用的内容。我的最后一步是提取“xml:id”的值
使用 perl XML::LibXML 删除具有某些属性的 XML 节点的标签
我正在使用 perl XML::LibXML 模块来操作 XML 文件。 我想删除 XML 节点的开始和结束标记(如果它具有某个属性),使其文本和子节点成为一部分...
我想将许多 xml 反序列化为 C# 对象,但 xml 的同一元素具有不同的名称。 私有 FileAsXML GetDataObject(字符串 xml) { FileAsXML 数据 = new FileAsXML();
底部导航栏只显示HomeFragment,不显示其他fragment
我有一个底部导航栏可以在片段之间切换,我在 MainActivity 中的功能正在工作,但是当我单击底部导航按钮时,屏幕停留在 HomeFragment 上不会更改为
让Nokogiri决定是否使用#fragment或#parse
我删除了这个问题,以抗议 Stack Overflow 与 OpenAI 的合作关系。我不同意我的写作被用来训练生成式人工智能模型。
我有一个独特的启动画面,名为splash.png,尺寸为1280x1280,150dpi 我在 React Native 项目中使用了react-native-bootsplash,但我认为这并不重要。 我的问题很简单:h...