将EditText转换为TextView

时间:2013-10-25 13:45:40

标签: android textview android-edittext

这是关于表现的问题,而不是关于能力的问题。

当我从findViewById(...)获取一个View时,它是一个EditText,但我不需要任何特定于EditText的内容,我应该将View转换为TextView还是EditText? TextView是View的更接近的子类,但EditText就是View的实际内容。

8 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我认为这样做没有问题。如果您没有任何EditText特定任务,请继续将其投射到TextView

P.S。: - 我个人经常这样做:D

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这就是我的想法,对我而言,清晰度比您在应用程序中想到的任何优化都更重要。如果您有一个EditText,那么请保留它,否则您只会对代码添加混淆。

答案 4 :(得分:0)

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

无论如何,虚拟机应该缓存方法解析的结果,因此在进一步使用中不会产生任何影响。

答案 5 :(得分:0)

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

编辑:此外,您现在可能不需要EditText功能,但将来您可能需要。只需将其保留为EditText,以便将来避免维护问题。

答案 6 :(得分:0)

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

这样做可以减少代码中的导入量,这可以(大幅度)减少已编译APK的大小。

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

答案 7 :(得分:-1)

你可以错过施法者。 findViewById返回View个对象。如果您不需要任何具体内容,请将其作为View对象

使用

修改

因为我们谈论的是性能,所以这是一个快速测试。结果看起来有点随机,但看起来EditText和TextView之间没有显着差异。只有Reflection方法较慢:

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) {
}
}