我們目前正在開發一個項目,無法通過這個奇怪的NullPointerException。我們必須將特定的EditText轉換爲TextView才能使我們的GridView正常工作。現在的問題是,所有教程似乎都使用了一個Activity,而我們正在使用Fragment。我們的「MainActivity」只是在這裏啓動一些初學者的東西(啓動畫面,簡介滑塊等)。所有其他的東西都發生在我們的「HomeFragment」中。我們的目標是捕獲一張圖片,寫一個標題和一些內容,然後將其保存到一個SQLite數據庫中,以後可以用它在GridView中顯示它。無法將EditText投射到自定義適配器中的TextView中
我們使用this guys(github)模板來創建我們自己的數據庫(並重寫了一些內容,因爲我們使用的是碎片,當然)。
在閱讀代碼時忍受着我們,它還沒有最終確定。垃圾代碼仍在裏面。
FragmentHome.class
public class FragmentHome extends Fragment {
private ImageButton mUnicornButton;
private ImageButton mBaseballbatButton;
private ImageButton mExplosionButton;
private ImageButton mCowButton;
private ImageButton mShitButton;
private ImageButton mPenguinButton;
private final int REQUEST_GALLERY_CODE = 999;
EditText edtTitle, edtContent;
Button btnAdd, btnChoose;
private ImageView mImageView;
protected View mView;
private static final int CAMERA_REQUEST = 1888;
public FragmentHome() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
public static SQLiteHelper sqLiteHelper;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_home, container, false);
this.mView = v;
initUI(v);
sqLiteHelper = new SQLiteHelper(getActivity().getApplicationContext(), "ListDB.sqlite",null,1);
sqLiteHelper.queryData("CREATE TABLE IF NOT EXISTS DBLIST(Id INTEGER PRIMARY KEY AUTOINCREMENT, title VARCHAR, content VARCHAR, image BLOB)");
btnChoose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},REQUEST_GALLERY_CODE);
}
});
Button photoButton = v.findViewById(R.id.add_foto);
photoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}
});
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try{
sqLiteHelper.insertData(
edtTitle.getText().toString().trim(),
edtContent.getText().toString().trim(),
imageViewToByte(mImageView)
);
Toast.makeText(getActivity().getApplicationContext(),"Added",Toast.LENGTH_SHORT).show();
edtTitle.setText("");
edtContent.setText("");
mImageView.setImageResource(R.mipmap.ic_launcher_round);
} catch(Exception e){
e.printStackTrace();
}
}
});
return v;
}
private byte[] imageViewToByte(ImageView image) {
Bitmap bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG,0,stream);
byte[] byteArray = stream.toByteArray();
return byteArray;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
if(requestCode == REQUEST_GALLERY_CODE){
if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_GALLERY_CODE);
}
else {
Toast.makeText(getActivity().getApplicationContext(),"No Permissions",Toast.LENGTH_SHORT).show();
}
return;
}
super.onRequestPermissionsResult(requestCode,permissions,grantResults);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
if(requestCode == CAMERA_REQUEST){
if(resultCode == Activity.RESULT_OK){
Bitmap bmp = (Bitmap) data.getExtras().get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray,0,byteArray.length);
mImageView.setImageBitmap(bitmap);
}
}
}
private void initUI(View v) {
[...] //initializes everything using findViewById()
}
}
DBListAdapter.class(我們的定製適配器)
public class DBListAdapter extends BaseAdapter{
private Context context;
private int layout;
private ArrayList<DBList> dblistsList;
public DBListAdapter(Context context, int layout, ArrayList<DBList> dblistsList) {
this.context = context;
this.layout = layout;
this.dblistsList = dblistsList;
}
@Override
public int getCount() {
return dblistsList.size();
}
@Override
public Object getItem(int position) {
return dblistsList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
private class ViewHolder{
ImageView imageView;
TextView txtTitle, txtContent;
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
View row = view;
ViewHolder holder = new ViewHolder();
if(row==null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(layout, null);
holder.txtTitle = row.findViewById(R.id.input_title);
holder.txtContent = row.findViewById(R.id.input_content);
holder.imageView = row.findViewById(R.id.fotoView);
row.setTag(holder);
}
else{
holder = (ViewHolder) row.getTag();
}
DBList dbList = dblistsList.get(position);
holder.txtTitle.setText(dbList.getTitle());
holder.txtContent.setText(dbList.getContent());
byte[] dblistImage = dbList.getImage();
Bitmap bitmap = BitmapFactory.decodeByteArray(dblistImage, 0, dblistImage.length);
holder.imageView.setImageBitmap(bitmap);
return row;
}
}
的問題是在這個適配器。
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference at s***.d***.u***.th***ive.DBListAdapter.getView(DBListAdapter.java:78)
我們無法弄清楚如何從fragment_home.xml投下的EditText成一個TextView,這是需要的ViewHolder。
fragment_home.xml
[...]
<ImageView
android:id="@+id/fotoView"
android:layout_width="match_parent"
android:layout_height="250dp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:background="@color/Gainsboro"
app:srcCompat="@android:drawable/ic_menu_camera" />
<EditText
android:id="@+id/input_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Title"
android:inputType="text"
android:maxLines="1"
android:textAlignment="center"
android:layout_above="@+id/input_content"
android:layout_alignParentStart="true" />
<EditText
android:id="@+id/input_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_what"
android:inputType="textMultiLine"
android:textAlignment="center"
android:layout_above="@+id/linearLayout"
android:layout_alignParentStart="true"
android:layout_marginBottom="33dp" /> [...]
任何幫助,將不勝感激,我的心在燃燒,現在,我certaintly不知道如何解決這個問題。如果你需要更多,請問我。現在有點累了,所以可能會遲到重播。
如果'fragment_home.xml'是你'Fragment'佈局,那麼'ImageView'和那些'TextView's應該是在一個單獨的佈局列表項的' R.id',你可以在你的'DBListAdapter'構造函數調用中將其作爲第二個參數傳遞給它。 –
將您的ViewHolder的類型從'TextView'改爲'EditText' –
@MikeM。我已經使用瞭解決方案,現在它顯示在我的網格中,但不是作爲TextView。我仍然可以「編輯」網格內的內容。 –