2013-08-06 110 views
0

我有一个足够简单的想法,这是让自定义键盘,而不是使用内置的键盘,以避免自动更正,符号,数字等,我不想在我的应用程序。出于某种原因,当我调用事件typeKey来“键入”一个字母时,事件调用本身会引发异常。自定义键盘抛出异常

下面是Java代码:

public class MainActivity extends Activity { 

    Vector<String> answer = new Vector<String>(1,1); 
    int ansLength = 1; 
    private TextView answerbox; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     answerbox = (TextView) findViewById(R.id.answerbox); 
     setContentView(R.layout.activity_main); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 


    public void typeKey(Object sender) 
    { 
     Button pressed = (Button) sender; 
     answer.add(ansLength, (String) pressed.getText()); 
     ansLength++; 
     answerbox.setText((CharSequence) answer); 
    } 
} 

下面是相关XML:

<Button 
      android:id="@+id/q" 
      style="?android:attr/buttonStyleSmall" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:text="Q" 
      android:onClick="typeKey"/> 
<TextView 
     android:id="@+id/answerbox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_x="43dp" 
     android:layout_y="40dp" 
     android:text="Large Text" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

我们的目标是能够输入和具有键入的文本显示为TextView的。我的想法是为每个键添加一个事件typeKey,它可以从任何称为事件的按钮中获取文本,将其添加到向量“answer”中,然后将textview设置为显示“answer” 。

这里是整个堆栈跟踪:

08-06 13:04:49.497: E/AndroidRuntime(15224): FATAL EXCEPTION: main 
08-06 13:04:49.497: E/AndroidRuntime(15224): java.lang.IllegalStateException: Could not execute method of the activity 
08-06 13:04:49.497: E/AndroidRuntime(15224): at android.view.View$1.onClick(View.java:3698) 
08-06 13:04:49.497: E/AndroidRuntime(15224): at android.view.View.performClick(View.java:4222) 
08-06 13:04:49.497: E/AndroidRuntime(15224): at android.view.View$PerformClick.run(View.java:17273) 
08-06 13:04:49.497: E/AndroidRuntime(15224): at android.os.Handler.handleCallback(Handler.java:615) 
08-06 13:04:49.497: E/AndroidRuntime(15224): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-06 13:04:49.497: E/AndroidRuntime(15224): at android.os.Looper.loop(Looper.java:137) 
08-06 13:04:49.497: E/AndroidRuntime(15224): at android.app.ActivityThread.main(ActivityThread.java:4895) 
08-06 13:04:49.497: E/AndroidRuntime(15224): at java.lang.reflect.Method.invokeNative(Native Method) 
08-06 13:04:49.497: E/AndroidRuntime(15224): at java.lang.reflect.Method.invoke(Method.java:511) 
08-06 13:04:49.497: E/AndroidRuntime(15224): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 
08-06 13:04:49.497: E/AndroidRuntime(15224): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 
08-06 13:04:49.497: E/AndroidRuntime(15224): at dalvik.system.NativeStart.main(Native Method) 
08-06 13:04:49.497: E/AndroidRuntime(15224): Caused by: java.lang.reflect.InvocationTargetException 
08-06 13:04:49.497: E/AndroidRuntime(15224): at java.lang.reflect.Method.invokeNative(Native Method) 
08-06 13:04:49.497: E/AndroidRuntime(15224): at java.lang.reflect.Method.invoke(Method.java:511) 
08-06 13:04:49.497: E/AndroidRuntime(15224): at android.view.View$1.onClick(View.java:3693) 
08-06 13:04:49.497: E/AndroidRuntime(15224): ... 11 more 
08-06 13:04:49.497: E/AndroidRuntime(15224): Caused by: java.lang.ClassCastException: java.util.Vector cannot be cast to java.lang.CharSequence 
08-06 13:04:49.497: E/AndroidRuntime(15224): at gguday.lexiconicmkii.MainActivity.typeKey(MainActivity.java:42) 
08-06 13:04:49.497: E/AndroidRuntime(15224): ... 14 more 

预先感谢任何帮助。

+1

请加堆栈跟踪 – Elist

+0

@Elist对不起,我不知道这实际上是什么...我是新来这个,这是我的一个预建的包装之外的第一个应用程序。你的意思是LogCat? –

+0

你说你有一个异常,但从来没有说过什么样的异常或从哪里抛出。一个“堆栈跟踪”给出了这两个信息:a)从Thread的开始(例如程序的开始)开始调用方法的列表(堆栈)到异常被“抛出”的方法(即创建)和b)抛出的异常(它是'class')和一个自定义消息。在哪里可以找到跟踪取决于你的IDE(你在使用eclipse吗?AndriodStudio?)但是如果你知道你有一个异常,这意味着你在某处看到了它,所以你应该能够找到它。 – Elist

回答

1

三个问题:

你试图寻找你answerbox视图调用setContentView(R.layout.activity_main)之前。这会导致answerbox为空,因为没有可用的视图(尚未),并在尝试访问answerbox时抛出NullPointerException。请致电setContentView(R.layout.activity_main)

请确保切换订单并搜索answerbox

setContentView(R.layout.activity_main); 
answerbox = (TextView) findViewById(R.id.answerbox); 

其次,改变你的点击方法采取View作为参数(而不是Object)的方法的onClick想到这个。虽然,我觉得你有什么应该没问题,因为视图在技术上是一个对象,您正在将其转换为适当的类型。我不确定在尝试打电话给点击监听器时有多挑剔,所以为了安全起见,我只是将其更改为View。例如,

public void typeKey(View sender) 
{ 
     Button pressed = (Button) sender; 
     answer.add(ansLength, (String) pressed.getText()); 
     ansLength++; 
     answerbox.setText((CharSequence) answer); 
} 

最后,

你不能简单地投你的矢量到的CharSequence。如果你想从中创建一个字符串,你将不得不遍历每个值并将其添加到一个更大的字符串中。

public void typeKey(View sender) 
{ 
    Button pressed = (Button) sender; 
    answer.add(ansLength, (String) pressed.getText()); 
    ansLength++; 


    StringBuilder stringBuilder = new StringBuilder(); 
    for (String string : answer) { 
     stringBuilder.append(string); 
    } 

    answerbox.setText(stringBuilder.toString()); 
} 

由于向量是零索引,您还应该从0开始ansLength。

int ansLength = 1; 
+0

我改变了我的代码,以避免你指出了错误,但是节约然后重新运行后,我仍然得到同样的错误,然后崩溃。特别是一个类文件编辑器:找不到Vector类的源文件,并在执行该方法时调用一个调用目标异常。 –

+0

@GilGuday我做了编辑,以包括为什么(希望)崩溃。如果不尝试查看logcat并抓取整个堆栈跟踪。 Logcat可以在eclipse的DDMS视图中找到。那里有一个Logcat标签。 – dymmeh

+0

@ dymmeh我试着将ansLength设置为0,仍然不运行。顺便说一句,我认为,具体载体0条目为空?我错了吗? –