在本文中,我们将详细介绍为什么我不能为textView(android)应用边距?的各个方面,并为您提供关于textview不可编辑的相关解答,同时,我们也将为您带来关于Androidjava.lan
在本文中,我们将详细介绍为什么我不能为 textView (android) 应用边距?的各个方面,并为您提供关于textview不可编辑的相关解答,同时,我们也将为您带来关于Android java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为android.widget.TextView、Android Studio RecyclerView androidx.constraintlayout.widget.ConstraintLayout 无法转换为 android.widget.TextView、Android TextView、Android TextView 使用替换构建出不同样式的字符串的有用知识。
本文目录一览:- 为什么我不能为 textView (android) 应用边距?(textview不可编辑)
- Android java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为android.widget.TextView
- Android Studio RecyclerView androidx.constraintlayout.widget.ConstraintLayout 无法转换为 android.widget.TextView
- Android TextView
- Android TextView 使用替换构建出不同样式的字符串
为什么我不能为 textView (android) 应用边距?(textview不可编辑)
如何解决为什么我不能为 textView (android) 应用边距?
TextView 代码:
<TextView
android:id="@+id/description_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text=""
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/domain_text"
tools:text="Description"
tools:visibility="visible" />
Here you can look at whole XML file 一切似乎都是正确的,但如果我启动该应用程序,我发现它不起作用。看看截图。 image
如果你有什么不明白的,就写下来,我的英语很差。
我该如何解决我的问题?
解决方法
当您使用约束并希望根据设置的约束设置小部件的 width
/height
时,将其 width
/height
设置为 {{1 }} 这意味着将约束填充为:
0dp
它会根据约束填充所有可用空间,然后您的 android:layout_width="0dp"
android:layout_height="0dp"
会起作用。
Android java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为android.widget.TextView
我正在尝试打印listView中单击的值,但后来我得到以下异常:
07-04 10:40:56.482: E/AndroidRuntime(1356): FATAL EXCEPTION: main
07-04 10:40:56.482: E/AndroidRuntime(1356): java.lang.classCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView
07-04 10:40:56.482: E/AndroidRuntime(1356): at com.passwordkeeper.ui.ActivityHomeScreen$1.onItemClick(ActivityHomeScreen.java:88)
这是一段代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTextView = (TextView) findViewById(R.id.labelList);
db = new DatabaseHandler(this);
createList();
displayList();
}
createList函数正常工作.这是我的displayList方法:
public void displayList(){
this.setlistadapter(new ArrayAdapter<String>(this, R.layout.activity_home_screen, R.id.listTextView, mAccountNames));
mListView = getListView();
mListView.setonItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
String product = ((TextView) view).getText().toString();
Log.v("mSelectedProduct", product);
}
});
}
我的文件activity_home_screen.xml的xml代码是:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/listTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="28dp"
android:layout_marginTop="26dp"
android:textAppearance="?android:attr/textAppearanceLarge" />
任何帮助都会有用!
谢谢.
解决方法:
你可以试试这个
mListView.setonItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
TextView txtview = (TextView)view.findViewById(R.id.listTextView);
String product = txtview.getText().toString();
Log.v("mSelectedProduct", product);
}
});
Android Studio RecyclerView androidx.constraintlayout.widget.ConstraintLayout 无法转换为 android.widget.TextView
如何解决Android Studio RecyclerView androidx.constraintlayout.widget.ConstraintLayout 无法转换为 android.widget.TextView
我刚刚开始使用 Kotlin 编程在 Android Studio 中学习 Android 应用。当我想创建一个简单的 RecyclerView 示例时。我在使用回收器视图适配器时遇到了错误。
我在网上学习了一些教程,但代码中仍然存在错误。我认为该错误来自 GameFragment.kt,它需要设置布局管理器(以下是与初始化回收器视图相关的代码)。
val adapter = GameAdapter()
binding.recyclerView.adapter = adapter
val linearlayoutmanager:linearlayoutmanager = linearlayoutmanager(activity)
linearlayoutmanager.orientation = linearlayoutmanager.VERTICAL
binding.recyclerView.layoutManager = linearlayoutmanager
我尝试打印日志信息,查看执行了哪个方法,结果显示adapter初始化了两次,onCreateViewHolder执行了一次,但是onBindViewHolder从来没有执行过。 在 linearlayoutmanager 中,我尝试将“this”、“activity”、“requiredActivity”、“this 作为上下文”、“activity.context”放入其中,但上述方法均无效。有谁知道我该如何解决这个问题?
生成的错误日志
java.lang.classCastException: androidx.constraintlayout.widget.ConstraintLayout cannot be cast to android.widget.TextView
at com.jasonpwy.simplecountdowntimer.game.GameAdapter.onCreateViewHolder(GameAdapter.kt:31)
at com.jasonpwy.simplecountdowntimer.game.GameAdapter.onCreateViewHolder(GameAdapter.kt:12)
at androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:7078)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6235)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
at androidx.recyclerview.widget.linearlayoutmanager$LayoutState.next(linearlayoutmanager.java:2303)
at androidx.recyclerview.widget.linearlayoutmanager.layoutChunk(linearlayoutmanager.java:1627)
at androidx.recyclerview.widget.linearlayoutmanager.fill(linearlayoutmanager.java:1587)
at androidx.recyclerview.widget.linearlayoutmanager.onLayoutChildren(linearlayoutmanager.java:665)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
at android.view.View.layout(View.java:21946)
at android.view.ViewGroup.layout(ViewGroup.java:6260)
at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1855)
at android.view.View.layout(View.java:21946)
at android.view.ViewGroup.layout(ViewGroup.java:6260)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:21946)
at android.view.ViewGroup.layout(ViewGroup.java:6260)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:21946)
at android.view.ViewGroup.layout(ViewGroup.java:6260)
at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:530)
at android.view.View.layout(View.java:21946)
at android.view.ViewGroup.layout(ViewGroup.java:6260)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:21946)
at android.view.ViewGroup.layout(ViewGroup.java:6260)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:21946)
at android.view.ViewGroup.layout(ViewGroup.java:6260)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:789)
at android.view.View.layout(View.java:21946)
at android.view.ViewGroup.layout(ViewGroup.java:6260)
at android.view.ViewRootImpl.performlayout(ViewRootImpl.java:3086)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2596)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1727)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7612)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1029)
at android.view.Choreographer.doCallbacks(Choreographer.java:852)
at android.view.Choreographer.doFrame(Choreographer.java:787)
at android.view.Choreographer$FramedisplayEventReceiver.run(Choreographer.java:1014)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:359)
at android.app.ActivityThread.main(ActivityThread.java:7407)
game_fragment.xaml
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
<variable
name="gameviewmodel"
type="com.example.simplecountdowntimer.game.Gameviewmodel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraint_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:id="@+id/activity_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:ems="10"
android:hint="@string/activity_name"
android:inputType="textPersonName"
app:layout_constraintBaseline_toBaselineOf="@+id/timer_text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/submit_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="20dp"
android:text="@string/submit"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/activity_name" />
<TextView
android:id="@+id/timer_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="16dp"
android:fontFamily="@font/roboto"
android:text="@{gameviewmodel.currentTimeString}"
android:textSize="28sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/activity_name"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/submit_btn"
app:layoutManager="androidx.recyclerview.widget.linearlayoutmanager"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
GameFragment.kt
package com.example.simplecountdowntimer.game
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.viewmodelProvider
import androidx.recyclerview.widget.linearlayoutmanager
import com.jasonpwy.simplecountdowntimer.R
import com.jasonpwy.simplecountdowntimer.databinding.GameFragmentBinding
class GameFragment : Fragment() {
private lateinit var viewmodel : Gameviewmodel
private lateinit var binding: GameFragmentBinding
override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {
// Inflate view and obtain an instance of the binding class
binding = DataBindingUtil.inflate(
inflater,R.layout.game_fragment,container,false
)
viewmodel = viewmodelProvider(this).get(Gameviewmodel::class.java)
binding.lifecycleOwner = this
binding.gameviewmodel = viewmodel
val adapter = GameAdapter()
binding.recyclerView.adapter = adapter
binding.submitBtn.setonClickListener {
Log.i("Test","It runs")
viewmodel.addText(binding.activityName.text.toString())
viewmodel.CountDown()
}
val linearlayoutmanager:linearlayoutmanager = linearlayoutmanager(activity)
linearlayoutmanager.orientation = linearlayoutmanager.VERTICAL
binding.recyclerView.layoutManager = linearlayoutmanager
viewmodel.ListData.observe(viewLifecycleOwner,Observer {
it?.let {
adapter.data = it
}
})
return binding.root
}
}
GameAdapter.kt
package com.jasonpwy.simplecountdowntimer.game
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.simplecountdowntimer.R
class GameAdapter() : RecyclerView.Adapter<GameAdapter.TextItemViewHolder>() {
init{
Log.i("Temp","Created")
}
var data = listof<String>()
set(value) {
field = value
notifyDataSetChanged()
}
override fun onBindViewHolder(holder: TextItemViewHolder,position: Int) {
val item = data[position]
holder.view.text = item
}
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): TextItemViewHolder {
val textView = LayoutInflater.from(parent.context).inflate(R.layout.game_fragment,parent,false)
return TextItemViewHolder(textView as TextView)
}
override fun getItemCount(): Int {
return data.size
}
class TextItemViewHolder(val view: TextView): RecyclerView.ViewHolder(view)
}
Gameviewmodel.kt
package com.example.simplecountdowntimer.game
import android.os.CountDownTimer
import android.text.format.DateUtils
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.mutablelivedata
import androidx.lifecycle.Transformations
import androidx.lifecycle.viewmodel
class Gameviewmodel : viewmodel(){
companion object {
// These represent different important times
// This is when the game is over
const val DONE = 0L
// This is the number of milliseconds in a second
const val ONE_SECOND = 1000L
// This is the total time of the game
const val COUNTDOWN_TIME = 10000L
}
private lateinit var timer : CountDownTimer
private var _currentTime = mutablelivedata<Long>()
val currentTime : LiveData<Long>
get() = _currentTime
val currentTimeString = Transformations.map(currentTime) { time ->
DateUtils.formatelapsedtime(time)
}
private val _storedText = mutablelivedata<String>()
val storeText : LiveData<String>
get() = _storedText;
private val _ListData = mutablelivedata<List<String>>()
val ListData : LiveData<List<String>>
get() = _ListData
init{
_storedText.value = ""
_ListData.value = listof()
_ListData.value = _ListData.value?.plus("Testing only")
}
fun CountDown(){
Log.i("Test","Count Down Start")
_currentTime.value = COUNTDOWN_TIME
timer = object : CountDownTimer(COUNTDOWN_TIME,ONE_SECOND) {
override fun onTick(millisUntilFinished: Long) {
_currentTime.value = (millisUntilFinished/ONE_SECOND)
}
override fun onFinish() {
_currentTime.value = DONE
}
}
timer.start()
}
fun addText(message: String){
_storedText.value += message
_storedText.value += "\\n"
_storedText.value?.let { Log.i("Test",it) }
_ListData.value = _ListData.value?.plus("Testing only")
}
}
解决方法
您的错误消息是不言自明的。 TextView
不能转换为 ConstraintLayout
。
当您在 onCreateViewHolder
中扩充视图时,您会得到一个 View
,它是您要扩充的布局的根 (game_fragment
),而根是一个 {{ 1}}。因此,当您编写 ConstraintLayout
时,您会收到错误消息,因为 return TextItemViewHolder(textView as TextView)
不是 ConstraintLayout
。
您必须使用 TextView
从膨胀的视图中获取 findViewById
,类似于下面的代码
,
TextView
我发现我误解了回收者视图的含义。我终于可以通过更改回收器视图适配器并在项目中再添加一个布局来解决问题。
我将项目上传到github:https://github.com/Jason627592/SimpleAndroidRecyclerViewExample
recyclerview 适配器的更新版本:
package com.example.simplecountdowntimer.game
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.jasonpwy.simplecountdowntimer.R
import kotlinx.android.synthetic.main.recyclerview_row.view.*
class TextItemViewHolder(view: View): RecyclerView.ViewHolder(view){
var content: TextView = view.stored_message
}
class GameAdapter() : RecyclerView.Adapter<TextItemViewHolder>() {
var data = listOf<String>()
set(value) {
field = value
notifyDataSetChanged()
}
override fun onBindViewHolder(holder: TextItemViewHolder,position: Int) {
val item = data[position]
holder.content.text = item
}
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): TextItemViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.recyclerview_row,parent,false)
return TextItemViewHolder(view)
}
override fun getItemCount(): Int {
return data.size
}
}
recyclerview_row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp">
<TextView
android:id="@+id/stored_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
tools:text="Testing" />
</LinearLayout>
Android TextView
1、TextView不用获取焦点也能实现跑马灯
public class MarqueeTextView extends TextView {
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
if(focused)
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
@Override
public void onWindowFocusChanged(boolean focused) {
if(focused)
super.onWindowFocusChanged(focused);
}
@Override
public boolean isFocused() {
return true;
}
}
android:singleLine="true"
android:focusable="true"
android:focusableInTouchMode="true"
android:ellipsize="marquee"
android:scrollHorizontally="true"
android:marqueeRepeatLimit="marquee_forever"
这里解决了:1、下拉状态栏到半截不松开时和失去焦点时显示"......"的问题
2、失去焦点不滚动问题。
原文地址:http://blog.csdn.net/wangjia55/article/details/7867437
2、上下行间距:
android:lineSpacingExtra="3dp" //设置行间距
android:lineSpacingMultiplier="1.2" // 设置行间距的倍数,如”1.2″。
左右字间距:
android:scaleX="3"
3、设置TextView下划线并响应点击事件(SpannableString)
http://blog.csdn.net/herbert5069/article/details/24587085
http://aichixihongshi.iteye.com/blog/1207503 (很全面)
4、TextView设置最多显示8个字符,超过部分显示...(省略号)
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="安德的游戏安德的游戏安德的游戏"
android:ellipsize="end"
android:singleLine="true"
android:maxEms="8"/>
如果加上android:paddingLeft="20dp",此时所限制的8个字符会出现问题。
Android TextView 使用替换构建出不同样式的字符串
大概说下情况,遇到有行拼凑出来的文字,有三种不同的大小颜色的样式。 我先使用ABC三个字符分别去按照顺序设置不同大小和颜色。然后 依次将需要样式的字符串替换到A,B,C。便可以拥有三段不同样式的字符串。
` /** * <构建样式不同的总计字符串> * @param num 共X件商品 * @param price 价格 * @param yf (含运费XXX) * @return * @throw * @return SpannableStringBuilder */ private SpannableStringBuilder buildSpanForCost(String num, String price, String yf) { String content = new String("ABC"); SpannableStringBuilder builder = new SpannableStringBuilder(content);
builder.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.text_deep_gray)), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(new AbsoluteSizeSpan(CommUtil.dip2px(getActivity(), 14)), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.text_deep_gray)), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(new AbsoluteSizeSpan(CommUtil.dip2px(getActivity(), 16)), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.text_light_gay)), 2, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(new AbsoluteSizeSpan(CommUtil.dip2px(getActivity(), 14)), 2, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//记录替换到的位置到哪了
int tmp_len = 0;
builder.replace(0, 1, num);
tmp_len += num.length();
builder.replace(tmp_len, tmp_len+1, price);
tmp_len += price.length();
builder.replace(tmp_len, tmp_len+1, yf);
return builder;
}
buildSpanForCost("共2件商品", " ¥1300.00 ", "(含运费XXX)")`
关于为什么我不能为 textView (android) 应用边距?和textview不可编辑的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Android java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为android.widget.TextView、Android Studio RecyclerView androidx.constraintlayout.widget.ConstraintLayout 无法转换为 android.widget.TextView、Android TextView、Android TextView 使用替换构建出不同样式的字符串的相关信息,请在本站寻找。
本文标签: