我正在尝试克隆 TextView 的行为。我已经检查过有关此主题的其他线程,很明显,最好的方法是通过 view.findViewById(id) 方法对小部件进行膨胀。但是,这种方式似乎只提供了 TextView 的静态行为的副本,即只提供了 XML 中定义的行为。但是,我需要做的是复制以编程方式更改的 TextView 的行为,这里是上下文:
- 下面是我的 XML。为了保持简单,我只关注一件事:使 TextView 可滚动(android:scrollbars="vertical"),但请记住,我需要 TextView 对象的行为比这复杂得多。
<TextView
android:id="@+id/text_test"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="14sp"
android:fontFamily="sans-serif-light"
android:textStyle="italic"
android:gravity="center_vertical"
android:layout_alignParentRight="true"
android:padding="5dp"
android:textColor="#fff"
android:background="?android:attr/activatedBackgroundIndicator"
android:text="Hello world"
android:scrollbars="vertical"/>
- 为了使 TextView 可滚动,我还必须在我的 Renderer 类的 inflate 方法中包含这两行:
TextView txtView = (TextView) view.findViewById(R.id.text_test);
txtView.setMovementMethod(new ScrollingMovementMethod());
- 现在,我需要做的是为上面的 txtView 对象创建多个副本(大约 200 个)。如果我只使用 findViewById 方法来扩充小部件,它将创建一个新的 TextView,其属性在我的 XML 中定义,但它不会包含我通过 setMovementMethod 设置为 txtView 的 ScrollingMovementMethod 对象的引用,所以我会以编程方式执行此操作,如下所示:
TextView[] array = new TextView[200];
for( int i = 0; i < 200; i++ ){
array[i] = (TextView) view.findViewById(R.id.text_test);
array[i].setMovementMethod( txtView.getMovementMethod() );
array[i].setEachMethodOfTextView( txtView.getEachMethodOfTextView() );
....
}
- 现在,这里的问题是我不仅需要复制移动方法,还需要复制在 txtView 上动态更改的所有类型的监听器和属性。如果我遵循与上一步相同的逻辑,我将不得不遵循一种繁琐且不优雅的方法,即从已以编程方式和动态方式更改的基础对象 (txtView) 中逐个复制每个属性。因此,我尝试使用深度克隆技术(使用 google guava 库),而不是那样,但我遇到了一些 StackOverflow 错误,因为 TextView 对象包含更复杂的对象和嵌套引用。这是日志跟踪:
12-31 12:38:12.165 27590-27590/example.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: example.your_app, PID: 27590
java.lang.StackOverflowError
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at org.objenesis.instantiator.android.Android18Instantiator.newInstance(Android18Instantiator.java:44)
at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:73)
at com.rits.cloning.ObjenesisInstantiationStrategy.newInstance(ObjenesisInstantiationStrategy.java:18)
at com.rits.cloning.Cloner.newInstance(Cloner.java:271)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:436)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject(Cloner.java:453)
at com.rits.cloning.Cloner.cloneInternal(Cloner.java:431)
at com.rits.cloning.Cloner.cloneObject
总而言之,我需要找出的是如何克隆/复制 TextView(更一般地说,任何类型的小部件 View )的所有行为,而不必一一设置每个属性和方法。
谢谢。
最佳答案
好吧,我认为解决方案非常非常简单:创建一个扩展 TextView 的自定义 View ,然后在该 CustomView 的构造函数中设置所有这些参数。然后在您的 xml 中使用此自定义 View 。
您甚至可以将您在 xml 中设置的所有这些参数移动到构造函数以简化 xml(像这样):
<your.package.view.CustomTextView
android:id="@+id/text_test"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentRight="true" />
关于android - 如何克隆/复制以编程方式更改的 TextView 对象的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27724625/