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

标签 android android-widget

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

  1. 下面是我的 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"/>

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

TextView txtView = (TextView) view.findViewById(R.id.text_test);
txtView.setMovementMethod(new ScrollingMovementMethod());

  1. 现在,我需要做的是为上面的 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() );
    ....
}

  1. 现在,这里的问题是我不仅需要复制移动方法,还需要复制在 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/

相关文章:

android - 使用 HDMI wifi dongle 在 Android 中进行截屏

android - 如何在 Google Play 开发者控制台中取消测试订阅

android - 饼图在 aChartEngine 中滚动到屏幕之外

android - 具有独立工作可点击 ImageView 的小部件的多个实例

android - 在 ionic android 平台中放置插页式广告的正确方法

java - 异步任务的进度对话框

java - Spinner 不会响应点击……即使调用了 onItemSelected?

java - Spinner 对象引用问题?

android - 我是怎么得到的,是在 facebook sdk 4.0.1 中用户登录还是注销

android - 在Android中导入Jama库