首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何克隆/复制以编程方式更改的TextView对象的行为?

如何克隆/复制以编程方式更改的TextView对象的行为?
EN

Stack Overflow用户
提问于 2014-12-31 17:57:51
回答 1查看 887关注 0票数 1

我试图克隆TextView的行为。关于这个主题,我已经检查了其他线程,很明显,最好的方法是通过view.findViewById(id)方法膨胀小部件。但是,这种方式似乎只提供了TextView静态行为的副本,也就是说,只提供了在XML中定义的行为。但是,我需要做的是复制以编程方式更改的TextView的行为,下面是上下文:

  1. 下面是我的XML。为了保持简单,我只关注一件事情:使TextView可滚动(android:scrollbars=“垂直”),但要记住,我需要对TextView对象进行更复杂的行为。

代码语言:javascript
复制
<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"/>

  1. 为了使TextView可滚动,我还必须在Renderer类的充气方法中包括这两行:

代码语言:javascript
复制
TextView txtView = (TextView) view.findViewById(R.id.text_test);
txtView.setMovementMethod(new ScrollingMovementMethod());

  1. 现在,我需要做的是创建上面的txtView对象的多个副本(大约200个)。如果我只通过使用findViewById方法来膨胀小部件,它将创建一个新的TextView,其中包含在XML中定义的属性,但是它不会包含通过setMovementMethod设置到txtView的ScrollingMovementMethod对象的引用,所以我必须以编程的方式执行它,如下所示:

代码语言:javascript
复制
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() );
    ....
}

  1. 现在,这里的问题是,我不仅需要复制移动方法,还需要复制在txtView上动态变化的所有类型的侦听器和属性。如果我遵循与前一步相同的逻辑,我将不得不遵循一种繁琐而不优雅的方法,从以编程方式动态更改的基本对象(txtView)逐个复制每个属性。因此,我尝试使用深度克隆技术(使用Google番石榴库),但我得到了一些StackOverflow错误,因为TextView对象包含更复杂的对象和嵌套引用。下面是日志跟踪:

代码语言:javascript
复制
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的所有行为(更广泛地说,是任何类型的小部件视图),而不必逐一设置每个属性和方法。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-01-02 04:36:23

我认为解决方案非常非常简单:创建一个扩展TextView的自定义视图,并在这个CustomView的构造函数中设置所有这些参数。然后在xml中使用这个自定义视图。

您甚至可以将在xml中设置的所有参数移动到构造函数中,以简化xml (如下所示):

代码语言:javascript
复制
<your.package.view.CustomTextView
    android:id="@+id/text_test"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true" />
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27724625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档