Я получил эту активность AddFood, от кого я могу добавлять объекты в свою базу данных. Когда я открываю действие из одного класса (класс, который впоследствии показывает базу данных в списке), все работает нормально.Добавление в базу данных sqlite из двух классов
Но когда я открываю операцию AddFood из своего основного класса, заполните поле и нажмите «Добавить», он покажет, когда я ищу его в классе, отображающем представление списка.
Это мой класс AddFood минус импорт.
package com.example.mappe3;
public class AddFood extends Activity implements OnClickListener{
private HousekeepingDBHelper hkDBhelper;
private EditText itemFood, itemWeight, itemPrice, itemBrand, itemCategory;
private String setFood, setWeight, setPrice, setBrand, setCategory;
private Spinner catagorySpinner;
private Button addButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_food);
hkDBhelper = new HousekeepingDBHelper(this);
itemFood = (EditText)findViewById(R.id.itemFood);
itemWeight = (EditText)findViewById(R.id.itemWeight);
itemPrice = (EditText)findViewById(R.id.itemPrice);
itemBrand = (EditText)findViewById(R.id.itemBrand);
itemCategory = (EditText)findViewById(R.id.itemCategory);
catagorySpinner = (Spinner)findViewById(R.id.catagory_spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.catagory_array, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
catagorySpinner.setAdapter(adapter);
addButton = (Button)findViewById(R.id.addButton);
addButton.setOnClickListener(this);
}
public void addItem(){
setFood = itemFood.getText().toString();
setWeight = itemWeight.getText().toString();
setPrice = itemPrice.getText().toString();
setBrand = itemBrand.getText().toString();
setCategory = catagorySpinner.getSelectedItem().toString();
if(setFood.length() != 0 && setWeight.length() != 0 && setPrice.length() != 0
&& setBrand.length() != 0 && setCategory.length() != 0){
Intent newIntent = getIntent();
newIntent.putExtra("tag_grocery_foodItem", setFood);
newIntent.putExtra("tag_grocery_weight", setWeight);
newIntent.putExtra("tag_grocery_price", setPrice);
newIntent.putExtra("tag_grocery_brand", setBrand);
newIntent.putExtra("tag_grocery_category", setCategory);
this.setResult(RESULT_OK, newIntent);
finish();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.add_food, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
if(v.getId() == R.id.addButton){
addItem();
}
}
}
И Heres класс, который показывает содержание, и где я могу использовать Addfood класс:
package com.example.mappe3;
public class DatabaseActivity extends Activity {
private HousekeepingDBHelper hkDBhelper;
private HousekeepingCursorAdapter hkCursorA;
private static final int ENTER_DATA_REQUEST_CODE = 1;
private ListView foodList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_database);
getActionBar().setDisplayHomeAsUpEnabled(true);
hkDBhelper = new HousekeepingDBHelper(this);
foodList = (ListView)findViewById(R.id.food_data);
runner();
}
public void runner(){
new Handler().post(new Runnable(){
@Override
public void run(){
hkCursorA = new HousekeepingCursorAdapter(DatabaseActivity.this, hkDBhelper.listAll());
foodList.setAdapter(hkCursorA);
}
});
}
@Override
protected void onActivityResult(int reqCode, int resCode, Intent data){
super.onActivityResult(reqCode, resCode, data);
if(reqCode == ENTER_DATA_REQUEST_CODE && resCode == RESULT_OK){
hkDBhelper.addItem(data.getExtras().getString("tag_grocery_foodItem"),
data.getExtras().getString("tag_grocery_weight"),
data.getExtras().getString("tag_grocery_price"),
data.getExtras().getString("tag_grocery_brand"),
data.getExtras().getString("tag_grocery_category"));
hkCursorA.changeCursor(hkDBhelper.listAll());
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.database, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
case R.id.addItem:
startActivityForResult(new Intent(this, AddFood.class), ENTER_DATA_REQUEST_CODE);
return true;
}
return super.onOptionsItemSelected(item);
}
}
Когда я сделал заполнение полей в моем классе AddFood он работает отделка(); и переходит к его предыдущей деятельности (DatabaseActivity), где я могу добавить новый объект в список.
Это моя MainActivity.java. Здесь я получаю неприятности.
package com.example.mappe3;
public class MainActivity extends Activity implements OnClickListener{
private Button databaseB;
private static final int ENTER_DATA_REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
databaseB = (Button)findViewById(R.id.food_db_button);
databaseB.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
//THIS IS WHAT I THOUGT WAS ENOUGH TO DO THE SAME THING IN THIS CLASS
if (id == R.id.addItem) {
startActivityForResult(new Intent(this, AddFood.class), ENTER_DATA_REQUEST_CODE);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
if(v.getId() == R.id.food_db_button){
Intent startIntent = new Intent(this, DatabaseActivity.class);
this.startActivityForResult(startIntent, 1);
}
}
}
После Im Добавив в классе AddFood от MainActivity она восходит к MainActivity, которым является то, что я хочу. Но тогда, когда я открываю DatabaseActivity, чтобы искать его, его нет. Я все еще вижу все элементы, добавленные из другого класса, но не тот, который я только что добавил.
Надеюсь, что мое объяснение имеет смысл для всех.
Может ли кто-нибудь увидеть, что я делаю неправильно?
Edit: onActivityResult() в MainActivity
@Override
protected void onActivityResult(int reqCode, int resCode, Intent data){
super.onActivityResult(reqCode, resCode, data);
if(reqCode == ENTER_DATA_REQUEST_CODE && resCode == RESULT_OK){
hkDBhelper.addItem(data.getExtras().getString("tag_grocery_foodItem"),
data.getExtras().getString("tag_grocery_weight"),
data.getExtras().getString("tag_grocery_price"),
data.getExtras().getString("tag_grocery_brand"),
data.getExtras().getString("tag_grocery_category"));
hkCursorA.changeCursor(hkDBhelper.listAll());
}
}
Журнал ошибок:
10-29 11:13:29.538: E/AndroidRuntime(28521): FATAL EXCEPTION: main
10-29 11:13:29.538: E/AndroidRuntime(28521): Process: com.example.s188094_mappe3, PID: 28521
10-29 11:13:29.538: E/AndroidRuntime(28521): java.lang.RuntimeException: Failure delivering result
ResultInfo{who=null, request=1, result=-1, data=Intent { cmp=com.example.s188094_mappe3/.AddFood
(has extras) }} to activity {com.example.s188094_mappe3/com.example.s188094_mappe3.MainActivity}:
java.lang.NullPointerException
10-29 11:13:29.538: E/AndroidRuntime(28521): at
android.app.ActivityThread.deliverResults(ActivityThread.java:3928)
10-29 11:13:29.538: E/AndroidRuntime(28521): at
android.app.ActivityThread.handleSendResult(ActivityThread.java:3978)
10-29 11:13:29.538: E/AndroidRuntime(28521): at
android.app.ActivityThread.access$1300(ActivityThread.java:156)
10-29 11:13:29.538: E/AndroidRuntime(28521): at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1403)
10-29 11:13:29.538: E/AndroidRuntime(28521): at
android.os.Handler.dispatchMessage(Handler.java:102)
10-29 11:13:29.538: E/AndroidRuntime(28521): at android.os.Looper.loop(Looper.java:157)
10-29 11:13:29.538: E/AndroidRuntime(28521): at
android.app.ActivityThread.main(ActivityThread.java:5867)
10-29 11:13:29.538: E/AndroidRuntime(28521): at java.lang.reflect.Method.invokeNative(Native
Method)
10-29 11:13:29.538: E/AndroidRuntime(28521): at java.lang.reflect.Method.invoke(Method.java:515)
10-29 11:13:29.538: E/AndroidRuntime(28521): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
10-29 11:13:29.538: E/AndroidRuntime(28521): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)
10-29 11:13:29.538: E/AndroidRuntime(28521): at dalvik.system.NativeStart.main(Native Method)
10-29 11:13:29.538: E/AndroidRuntime(28521): Caused by: java.lang.NullPointerException
10-29 11:13:29.538: E/AndroidRuntime(28521): at
com.example.s188094_mappe3.MainActivity.onActivityResult(MainActivity.java:40)
10-29 11:13:29.538: E/AndroidRuntime(28521): at
android.app.Activity.dispatchActivityResult(Activity.java:5535)
10-29 11:13:29.538: E/AndroidRuntime(28521): at
android.app.ActivityThread.deliverResults(ActivityThread.java:3924)
10-29 11:13:29.538: E/AndroidRuntime(28521): ... 11 more
Хм. Я понимаю. Очень хорошее объяснение. Ну, я попробовал добавить onActivityResult() в MainActivity, и теперь я получил эту ошибку: Failure delivering result ResultInfo {who = null, request = 1, result = -1, data = Intent {cmp = com.example.s188094_mappe3 /. AddFood (есть дополнительные функции)}} Какие-нибудь идеи? –
В журнале должно быть больше. Stacktrace был бы полезен. Пожалуйста, опубликуйте свою реализацию 'MainActivity.onActivityResult()' и ошибки logcat, включая stacktrace в вашем вопросе. –
Не пытайтесь опубликовать это как комментарий. просто отредактируйте свой вопрос и добавьте эту информацию внизу –