2

这是一个关于性能的问题,而不是关于能力的问题。

当我从 findViewById(...) 获得一个视图时,它是一个 EditText,但我不需要任何特定于 EditText 的内容,我应该将视图转换为 TextView 还是 EditText?TextView 是 View 的一个更接近的子类,但 EditText 是 View 的真正含义。

4

8 回答 8

1

恕我直言,是的,您可以将edittext转换为textview。但我不认为有任何必须遵守的规则。您可以通过转换为 edittext 或 textview 来执行操作。

由于您不需要 edittext 的功能,您当然可以转换为 textview

于 2013-10-25T13:49:51.303 回答
0

最后,该对象已经存在,并且它是一个 EditText,因此无论您要投射什么内容,您都将访问一个 EditText。您只是为了在代码中使用它的方法而强制转换它,但对象实例不会改变。因此,关于继承,例如,如果 EditText 已覆盖 TextView 的方法,如果您将对象转换为 TextView 并使用它,您仍将使用 EditText 方法。

反正虚拟机应该缓存方法解析的结果,对以后的使用没有影响。

于 2013-10-25T14:00:07.127 回答
0

我发现在 java 代码中将 EditText 转换为 TextView 是有好处的。

这样做可以减少代码中的导入量,从而(极大地)减少编译后的 APK 的大小。

EditTexts 和 Buttons 在代码中通常可以作为 TextViews 引用(Buttons 也可以只是一个 View)。几乎任何类型的 ViewGroup 都可以仅作为 ViewGroup 引用。AbsListView 而不是 ListView (API 11+)。AbsSpinner 而不是 Spinner。仅举几个简单的。这样做使我的一些 apk 大小减少了 20-30%。

于 2014-02-18T15:48:25.160 回答
0

不要担心过早的优化。这实际上是您代码中的瓶颈吗?不应该。这样的事情完全可以忽略不计。它不应该对性能产生任何明显的影响,因为它仍然是相同的底层对象,只是类型的处理方式不同。

编辑:此外,您现在可能不需要 EditText 功能,但将来可能需要。只需将其保留为 EditText 即可免去您日后维护的麻烦。

于 2013-10-25T14:45:41.330 回答
0

我认为这样做没有问题。如果您没有任何EditText特定任务,请继续并将其转换为TextView.

PS:-我个人总是这样做..:D

于 2013-10-25T13:49:31.630 回答
0

您应该将其转换为 EditText,否则它将通过异常并且您的应用程序将崩溃。顺便说一句,如果您在代码中执行此类操作,我认为您没有遵循良好的做法。所以不要那样做。

于 2013-10-25T13:49:56.273 回答
0

这就是我的想法,对我来说,清晰比你能想到的在应用程序中进行的任何优化都更重要。如果您有一个 EditText 则保留它,否则您只会给代码添加混乱。

于 2013-10-25T13:50:52.487 回答
-1

你可以错过演员表。findViewById返回一个View对象。如果您不需要任何特定的东西,请将其作为View对象使用

编辑:

由于我们谈论的是性能,这里有一个快速测试。结果对我来说看起来有点随机,但看起来 EditText 和 TextView 之间没有显着差异。只有反射方法较慢:

try {
    String text = "";
    String result = "";

    //Reflection
    Long time = SystemClock.elapsedRealtimeNanos();
    View v = ctx.findViewById(R.id.hello_text);
    Field f = v.getClass().getSuperclass().getDeclaredField("mText");
    f.setAccessible(true);
    text = f.get(v).toString();
    time = SystemClock.elapsedRealtimeNanos() - time;                   
    result = "via Reflection ("+time.toString()+" ms)";

    //TextView
    time = SystemClock.elapsedRealtimeNanos();
    TextView t = (TextView)ctx.findViewById(R.id.hello_text);
    text = t.getText().toString();
    time = SystemClock.elapsedRealtimeNanos() - time;
    result = result + "\nvia TextView ("+time.toString()+" ms)";

    //EditText
    time = SystemClock.elapsedRealtimeNanos();
    EditText e = (EditText)ctx.findViewById(R.id.hello_text);
    text = e.getText().toString();
    time = SystemClock.elapsedRealtimeNanos() - time;                   
    result = result + "\nvia EditText ("+time.toString()+" ms)";

    Toast.makeText(ctx, result, Toast.LENGTH_SHORT).show();
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (NoSuchFieldException e) {
}
}
于 2013-10-25T13:51:35.703 回答