2014-02-19 3 views
0

В моей деятельности пользователь может сделать снимок, а затем установить захват изображения в gridview.And i gridview у вас есть изображение (захватить изображение) и 2 редактировать текст. Теперь я хочу для сохранения информации в 2 редактировать текст с общим файлом предпочтений в onPause(); и вернуть значение из файла общих предпочтений в edittext в onResume.Невозможно приостановить действие java.lang.NullPointerException

это мой код

public class MainActivity extends Activity { 

private Button btPhoto, btSave; 
private GridView gridview; 
private File imgFile; 
private String path; 
private ArrayList<File> List_File; 
private static final int imageCode = 100; 
private Context context; 
SharedPreferences preference; 
SharedPreferences.Editor editor; 




@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    btPhoto = (Button) findViewById(R.id.btPhoto); 
    btSave = (Button) findViewById(R.id.bt_save); 
    gridview = (GridView) findViewById(R.id.gridview); 

    path = "/TongFolder/"; 
    context = this; 
    List_File = new ArrayList<File>(); 
    File imgDir = new File(Environment.getExternalStorageDirectory()+path); 
    imgDir.mkdirs(); 
    boolean check = imgDir.isDirectory(); 
    if(check == true){ 
    btPhoto.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      capture(); 

     } 
    }); 
    }else{ 
     System.out.println("not create"); 
    } 
} 


public void capture(){ 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    imgFile = new File(Environment.getExternalStorageDirectory()+path, 
      "img_"+System.currentTimeMillis()+".jpg"); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imgFile)); 
    startActivityForResult(intent, imageCode); 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data){ 

    if(requestCode == imageCode && resultCode == RESULT_OK){ 

     //add path to arrayList 
     List_File.add(imgFile); 
     for (File file : List_File) { 
      String showPath = file.getPath(); 
      System.out.println(showPath); 
     } 

     gridview.setAdapter(new gridViewAdapter(context, List_File)); 


    } 

} 

public void onPause(){ 

    super.onPause(); 
     //initialize 
    preference = getPreferences(Context.MODE_PRIVATE); 
    EditText edit_num = new EditText(getApplicationContext()); 
    EditText edit_info = new EditText(getApplicationContext()); 

    //count child of gridview 
    int size = gridview.getChildCount(); 
    System.out.println("size_"+size); 
    if(size == 0){ 

    }else{ 
     ViewGroup child_grid = (ViewGroup) gridview.getChildAt(size); 
     //get editText in child_gridview 
     edit_num = (EditText) child_grid.findViewById(R.id.editText_num); 
     edit_info = (EditText) child_grid.findViewById(R.id.editText_info); 

     String num = edit_num.getText().toString(); 
     String info = edit_info.getText().toString(); 

     //save data to sharedpreference file 
     editor = preference.edit(); 
     editor.putString("number_recipe_"+size, num); 
     editor.putString("info_recipe_"+size, info); 
     editor.commit(); 

     System.out.println("data in position "+size+" is "+num+"and"+info); 
    } 
} 

public void onResume(){ 
    super.onResume(); 

    //initialize 
    EditText edit_num = new EditText(getApplicationContext()); 
    EditText edit_info = new EditText(getApplicationContext()); 

    //count child in gridview 
    int size = gridview.getChildCount(); 
    System.out.println("onResume_child in gridview have "+size); 

    //for loop to put data in shared preference to edittext(2) 
    for(int i = 0; i<size; i++){ 
     ViewGroup child_grid = (ViewGroup) gridview.getChildAt(i); 
     //findviewById edittext in childAt (i) 
     edit_num = (EditText) child_grid.findViewById(R.id.editText_num); 
     edit_info = (EditText) child_grid.findViewById(R.id.editText_info); 
     //get value from shared preference file and set text to editText 
     String number = preference.getString("number_recipe_"+i, null); 
     String information = preference.getString("info_recipe_"+i, null); 

     edit_num.setText(number); 
     edit_info.setText(information); 
    } 

} 


@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; 
} 

}

и это мой LogCat

02-19 21:11:51.136: E/AndroidRuntime(15891): FATAL EXCEPTION: main 
02-19 21:11:51.136: E/AndroidRuntime(15891): java.lang.RuntimeException: Unable to pause activity {com.example.imagecapture/com.example.imagecapture.MainActivity}: java.lang.NullPointerException 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2902) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2858) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2836) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.ActivityThread.access$900(ActivityThread.java:140) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1248) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.os.Looper.loop(Looper.java:137) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.ActivityThread.main(ActivityThread.java:4921) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at java.lang.reflect.Method.invokeNative(Native Method) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at java.lang.reflect.Method.invoke(Method.java:511) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at dalvik.system.NativeStart.main(Native Method) 
02-19 21:11:51.136: E/AndroidRuntime(15891): Caused by: java.lang.NullPointerException 
02-19 21:11:51.136: E/AndroidRuntime(15891): at com.example.imagecapture.MainActivity.onPause(MainActivity.java:123) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.Activity.performPause(Activity.java:5304) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1240) 
02-19 21:11:51.136: E/AndroidRuntime(15891): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2889) 
02-19 21:11:51.136: E/AndroidRuntime(15891): ... 12 more 

Спасибо

+1

можете ли вы указать, какая строка 123 в вашей основной деятельности? –

ответ

2

Я вижу одну возможную ошибку в коде, которые могут привести Исключение нулевого указателя.

В приведенном ниже коде getChildCount возвращает количество дочерних элементов в группе ViewGroup, но не самый высокий показатель . Вы должны использовать размер - 1, чтобы получить последнего ребенка!

Неправильный

int size = gridview.getChildCount(); 
ViewGroup child_grid = (ViewGroup) gridview.getChildAt(size); 

Правильная

int size = gridview.getChildCount(); 
ViewGroup child_grid = (ViewGroup) gridview.getChildAt(size - 1); 
+0

Спасибо. хорошо объясните. – user3001046

+0

Но у меня есть вопрос. Почему int size = gridview.getChildCount(); == 0 In onResume – user3001046

+0

Это зависит от того, что вы добавили в GridView. –

0

Хотя это не будет, как я решил эту ошибку. Да я столкнулся эту ошибку несколько раз, и в конце концов узнал, что

«его основной причиной является то, что некоторые компоненты конкретной деятельности имеет нулевое значение»

не обязательно, что компилятор указывает на. Итак, просто проверьте значения нулевого указателя

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