2013-08-06 4 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, которое получило бы текст от любой кнопки, называемой событием, добавив ее в векторный «ответ», а затем установив текстовое представление для отображения текста «ответа», ,

Здесь вся трассировка стеки:

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

Пожалуйста, добавьте StackTrace – Elist

+0

@Elist Я сожалею, я не уверен, на самом деле, что это такое ... Я новичок в этом, это мое первое приложение за пределами предварительно построенном обертке. Вы имеете в виду LogCat? –

+0

Вы говорите, что у вас есть исключение, но никогда не говорили, какое исключение или откуда оно было выброшено. «Трассировка стека» дает именно эти две части информации: а) список (стек) методов, называемых с начала потока (скажем, начало вашей программы) методу, в котором исключение было «выброшено» (т. Е. created) И b) тип созданного исключения (это 'class') и настраиваемое сообщение. Где найти трассировку зависит от вашей IDE (вы работаете с eclipse? AndriodStudio?), но если вы знаете, что у вас есть исключение, значит, вы видели его где-то, так что вы должны его найти. – Elist

ответ

1

три вопроса:

Вы пытаетесь искать вашего answerbox зрения, прежде чем звонить setContentView(R.layout.activity_main). Это всегда приведет к тому, что answerbox будет пустым, так как пока нет доступных представлений (views) и бросьте NullPointerException при попытке доступа к answerbox. Обязательно переключите заказ и выполните поиск answerbox после того, как вы позвоните setContentView(R.layout.activity_main)

Ex.

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

Во-вторых, изменить метод щелчка, чтобы взять View в качестве параметра (вместо Object), как методы OnClick ожидать это .. Хотя, я думаю, что у вас есть должно быть нормально так как View технически является объектом и вы переводите его на соответствующий тип. Я не уверен, насколько это придирчиво, когда пытаешься вызвать слушателя кликов, поэтому для безопасности я просто изменил бы его на 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()); 
} 

Вы также должны начать свою ansLength в 0, поскольку векторы нулевые индексируются.

int ansLength = 1; 
+0

Я изменил свой код, чтобы избежать ошибок, которые вы указали, однако после сохранения и повторного воспроизведения я все равно получаю те же ошибки, что и после сбоя. В частности, редактор файлов классов: источник не найден для класса Vector, а при выполнении метода - исключение целевых вызовов. –

+0

@GilGuday Я сделал редактирование, чтобы указать, почему это (надеюсь) рушится. Если вы не попытаетесь найти лог-код и захватите всю стек. Logcat находится в представлении DDMS для eclipse. Там есть вкладка Logcat. – dymmeh

+0

@ dymmeh Я попробовал установить ansLength на 0, но все равно не запускается. BTW, я думал, что с векторами, в частности, запись 0 равна нулю? Был ли я неправ? –

Смежные вопросы