这是一个关于性能的问题,而不是关于能力的问题。
当我从 findViewById(...) 获得一个视图时,它是一个 EditText,但我不需要任何特定于 EditText 的内容,我应该将视图转换为 TextView 还是 EditText?TextView 是 View 的一个更接近的子类,但 EditText 是 View 的真正含义。
这是一个关于性能的问题,而不是关于能力的问题。
当我从 findViewById(...) 获得一个视图时,它是一个 EditText,但我不需要任何特定于 EditText 的内容,我应该将视图转换为 TextView 还是 EditText?TextView 是 View 的一个更接近的子类,但 EditText 是 View 的真正含义。
恕我直言,是的,您可以将edittext转换为textview。但我不认为有任何必须遵守的规则。您可以通过转换为 edittext 或 textview 来执行操作。
由于您不需要 edittext 的功能,您当然可以转换为 textview
最后,该对象已经存在,并且它是一个 EditText,因此无论您要投射什么内容,您都将访问一个 EditText。您只是为了在代码中使用它的方法而强制转换它,但对象实例不会改变。因此,关于继承,例如,如果 EditText 已覆盖 TextView 的方法,如果您将对象转换为 TextView 并使用它,您仍将使用 EditText 方法。
反正虚拟机应该缓存方法解析的结果,对以后的使用没有影响。
我发现在 java 代码中将 EditText 转换为 TextView 是有好处的。
这样做可以减少代码中的导入量,从而(极大地)减少编译后的 APK 的大小。
EditTexts 和 Buttons 在代码中通常可以作为 TextViews 引用(Buttons 也可以只是一个 View)。几乎任何类型的 ViewGroup 都可以仅作为 ViewGroup 引用。AbsListView 而不是 ListView (API 11+)。AbsSpinner 而不是 Spinner。仅举几个简单的。这样做使我的一些 apk 大小减少了 20-30%。
不要担心过早的优化。这实际上是您代码中的瓶颈吗?不应该。这样的事情完全可以忽略不计。它不应该对性能产生任何明显的影响,因为它仍然是相同的底层对象,只是类型的处理方式不同。
编辑:此外,您现在可能不需要 EditText 功能,但将来可能需要。只需将其保留为 EditText 即可免去您日后维护的麻烦。
我认为这样做没有问题。如果您没有任何EditText
特定任务,请继续并将其转换为TextView
.
PS:-我个人总是这样做..:D
您应该将其转换为 EditText,否则它将通过异常并且您的应用程序将崩溃。顺便说一句,如果您在代码中执行此类操作,我认为您没有遵循良好的做法。所以不要那样做。
这就是我的想法,对我来说,清晰比你能想到的在应用程序中进行的任何优化都更重要。如果您有一个 EditText 则保留它,否则您只会给代码添加混乱。
你可以错过演员表。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) {
}
}