2013-08-06 146 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條目爲空?我錯了嗎? –