2013-10-14 4 views
-1

У меня есть следующий код, который вызывается событием onClick кнопок, содержащихся в ListView.Диалог сбой при установке TextView

public void viewExerciseHistory(View view) { 
    // History button click handler 
    LinearLayout parentRow = (LinearLayout)view.getParent(); 

    TextView exerciseNameTextView = (TextView)parentRow.getChildAt(0); 
    String exerciseName = (String)exerciseNameTextView.getText(); 

    final Dialog dialog = new Dialog(context); 

    dialog.setContentView(R.layout.exercise_history_dialog); 
    dialog.setTitle(exerciseName); 

    TextView headerTextView = (TextView)view.findViewById(R.id.exercise_history_dialog_name_textview); 
    //headerTextView.setText("History"); 

    Button closeDialogButton = (Button)view.findViewById(R.id.exercise_history_dialog_close_button); 
    //closeDialogButton.setOnClickListener(new OnClickListener() { 
    // @Override 
    // public void onClick(View v) { 
    //  dialog.dismiss(); 
    // } 
    //}); 

    dialog.show(); 
} 

элемент управления ListView строка определяется следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <TextView android:id="@+id/exercise_history_dialog_name_textview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:typeface="monospace" 
     android:textSize="15sp" /> 

    <Button android:id="@+id/exercise_history_dialog_close_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:typeface="monospace" 
     android:textSize="12sp" 
     android:textColor="@color/button_blue_text" 
     android:text="@string/button_text_close" 
     style="?android:attr/borderlessButtonStyle" /> 
</RelativeLayout> 

Приведенный выше код работает отлично и отображает диалоговое окно, но если раскомментировать вне headerTextView.setText("History") или closeDialog.setOnClickListener он падает с NullPointerException.

Может ли кто-нибудь объяснить, что я делаю неправильно?

EDIT LogCat:

10-14 21:36:19.755: W/IInputConnectionWrapper(26167): getTextBeforeCursor on inactive InputConnection 
10-14 21:36:19.755: W/IInputConnectionWrapper(26167): getTextAfterCursor on inactive InputConnection 
10-14 21:36:19.915: W/IInputConnectionWrapper(26167): getTextBeforeCursor on inactive InputConnection 
10-14 21:36:19.945: W/IInputConnectionWrapper(26167): getTextAfterCursor on inactive InputConnection 
10-14 21:36:20.435: D/AndroidRuntime(26167): Shutting down VM 
10-14 21:36:20.435: W/dalvikvm(26167): threadid=1: thread exiting with uncaught exception (group=0x40e27930) 
10-14 21:36:20.445: E/AndroidRuntime(26167): FATAL EXCEPTION: main 
10-14 21:36:20.445: E/AndroidRuntime(26167): java.lang.IllegalStateException: Could not execute method of the activity 
10-14 21:36:20.445: E/AndroidRuntime(26167): at android.view.View$1.onClick(View.java:3599) 
10-14 21:36:20.445: E/AndroidRuntime(26167): at android.view.View.performClick(View.java:4204) 
10-14 21:36:20.445: E/AndroidRuntime(26167): at android.view.View$PerformClick.run(View.java:17355) 
10-14 21:36:20.445: E/AndroidRuntime(26167): at android.os.Handler.handleCallback(Handler.java:725) 
10-14 21:36:20.445: E/AndroidRuntime(26167): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-14 21:36:20.445: E/AndroidRuntime(26167): at android.os.Looper.loop(Looper.java:137) 
10-14 21:36:20.445: E/AndroidRuntime(26167): at android.app.ActivityThread.main(ActivityThread.java:5041) 
10-14 21:36:20.445: E/AndroidRuntime(26167): at java.lang.reflect.Method.invokeNative(Native Method) 
10-14 21:36:20.445: E/AndroidRuntime(26167): at java.lang.reflect.Method.invoke(Method.java:511) 
10-14 21:36:20.445: E/AndroidRuntime(26167): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
10-14 21:36:20.445: E/AndroidRuntime(26167): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
10-14 21:36:20.445: E/AndroidRuntime(26167): at dalvik.system.NativeStart.main(Native Method) 
10-14 21:36:20.445: E/AndroidRuntime(26167): Caused by: java.lang.reflect.InvocationTargetException 
10-14 21:36:20.445: E/AndroidRuntime(26167): at java.lang.reflect.Method.invokeNative(Native Method) 
10-14 21:36:20.445: E/AndroidRuntime(26167): at java.lang.reflect.Method.invoke(Method.java:511) 
10-14 21:36:20.445: E/AndroidRuntime(26167): at android.view.View$1.onClick(View.java:3594) 
10-14 21:36:20.445: E/AndroidRuntime(26167): ... 11 more 
10-14 21:36:20.445: E/AndroidRuntime(26167): Caused by: java.lang.NullPointerException 
10-14 21:36:20.445: E/AndroidRuntime(26167): at com.example.workoutlog.ManageWorkouts.viewExerciseHistory(ManageWorkouts.java:269) 
10-14 21:36:20.445: E/AndroidRuntime(26167): ... 14 more 
+0

Пожалуйста, разместите Logcat. – Prmths

+0

LogCat добавлен, спасибо – CrazyHorse

+0

Ваша ошибка в строке 269 класса Manageworkouts в методе, который вы указали выше. Что на этой линии? – Prmths

ответ

2

Это сбой, потому что эта линия:

TextView headerTextView = (TextView) findViewById(R.id.exercise_history_dialog_name_textview); 

фактически возвращается нулем.

Метод findViewById ищет представление в представлении контента основной деятельности. Вместо этого вы хотите использовать метод findViewById для объекта view. Вызов findViewById в объекте view позволит вам получить поля, которые вы после.

dialog.setContentView(R.layout.exercise_history_dialog); 

TextView headerTextView = (TextView) dialog.findViewById(R.id.exercise_history_dialog_name_textview); 
headerTextView.setText("History"); 
+0

Отлично, это исправлено. Совершенно верно, теперь вы сказали это, спасибо за вашу помощь – CrazyHorse

+0

после setContentView, вы можете использовать это диалоговое окно для findViewById. Не нужно сначала раздувать вид диалога так, как это – ElefantPhace

+0

Ах достаточно. Я никогда не замечал, что в диалоге есть метод findByViewMethod. Я отредактирую код, чтобы сделать его более чистым. –

0

Попробуйте изменить эти

TextView headerTextView = (TextView)findViewById(R.id.exercise_history_dialog_name_textview); 
Button closeDialogButton = (Button)findViewById(R.id.exercise_history_dialog_close_button); 

в

TextView headerTextView = (TextView)dialog.findViewById(R.id.exercise_history_dialog_name_textview); 
Button closeDialogButton = (Button)dialog.findViewById(R.id.exercise_history_dialog_close_button); 

Вы должны сказать, какой вид вы хотите findViewById от

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