2013-12-18 2 views
0

Я новичок в Android, мое приложение извлекает данные из базы данных на onCreate() и показывает его на 2 TextViews (tv_aye, tv_tarjome), а затем, нажав на btn_search Звоню подвид деятельности (Активность поиска) с StartActivityForResult(). В активности поиска отображается список, показывающий результат поиска. При щелчке по каждому элементу списка он должен вернуться к родительскому действию и заменить текстовые поля содержимым выбранного элемента списка. Проблема в том, что он отправляет данные через setResult() родительскому объекту, ничего не изменилось, и TextViews выглядят как первый запуск. Я проследил код с точками останова, но onActivityResult() никогда не вызывается для извлечения данных. Если кто-то может мне помочь, я ценю заранее.извлечение данных из второй активности

Моего Main_Activity код выглядит так:

public class Main_Activity extends Activity { 

private static String[] getAye; 
private static String[] selectedSure; 
private static int sure; 
TextView tv_aye,tv_tarjome; 

List<Pair_aye_tarjome> searchList; 
DBOpenHelper db; 
Pair_aye_tarjome result; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

//--------------Giving reference to widgets-----------------------------------   
    Typeface faceArabi = Typeface.createFromAsset(getAssets(), "fonts/Nabi.ttf"); 
    Typeface faceFarsi = Typeface.createFromAsset(getAssets(), "fonts/BKoodakBold.ttf"); 
    Typeface faceTitle = Typeface.createFromAsset(getAssets(), "fonts/BSinaBold.ttf"); 

    final TextView tv_besm = (TextView) findViewById(R.id.tv_besm); 
    tv_besm.setTypeface(faceArabi); 
    TextView tv_lbl_aye = (TextView) findViewById(R.id.tv_lbl_aye); 
    tv_lbl_aye.setTypeface(faceTitle); 
    final TextView tv_aye  = (TextView) findViewById(R.id.tv_aye); 
    tv_aye.setTypeface(faceArabi); 
    tv_aye.setMovementMethod(new ScrollingMovementMethod()); 
    TextView tv_lbl_tarjome = (TextView) findViewById(R.id.tv_lbl_tarjome); 
    tv_lbl_tarjome.setTypeface(faceTitle); 
    final TextView tv_tarjome  = (TextView) findViewById(R.id.tv_tarjome); 
    tv_tarjome.setTypeface(faceFarsi); 
    tv_tarjome.setMovementMethod(new ScrollingMovementMethod()); 

    final NumberPicker np_sure = (NumberPicker) findViewById(R.id.np_sure); 
    final NumberPicker np_aye = (NumberPicker) findViewById(R.id.np_aye); 

    Button btn = (Button) findViewById(R.id.btn); 
    btn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      Intent searchIntent = new Intent(Main_Activity.this,Search.class); 
      startActivityForResult(searchIntent,1); 

     } 
    }); 

//--------------Connect to database---------------------------------------------- 
    db = new DBOpenHelper(getBaseContext()); 
    try { 
      db.createDatabase(); 

     } catch (Exception ioe) { 
       throw new Error("Unable to create database");   
     } 

    try {   
      db.openDatabase(); 

     }catch(SQLException sqle){ 
      throw sqle; 
     } 

//---------------------Initializing Number Pickers------------------------------------- 
    np_sure.setMinValue(1); 
    np_sure.setMaxValue(getResources().getStringArray(R.array.Sureh).length); 
    np_sure.setDisplayedValues(getResources().getStringArray(R.array.Sureh)); 

    sure = 1; 
    np_aye.setMinValue(1); 
    getAye = db.getAyeNumbers(sure); 
    np_aye.setMaxValue(getAye.length); 
    np_aye.setDisplayedValues(getAye); 
    result = db.retrieveAye(sure,1,db.TABLE); 
    tv_aye.setText(result.getAye()); 
    tv_tarjome.setText(result.getTarjome());   


//--------------------Setting event handlers--------------------------- 

    np_sure.setOnValueChangedListener(new OnValueChangeListener() { 

     @Override 
     public void onValueChange(NumberPicker picker, int oldValue, int newValue) { 

      selectedSure = picker.getDisplayedValues(); 
      Toast.makeText(getBaseContext(),String.valueOf(selectedSure[newValue-1]),Toast.LENGTH_LONG).show(); 
      sure = newValue; 
      Toast.makeText(getBaseContext(),String.valueOf(sure),Toast.LENGTH_LONG).show(); 
      getAye = db.getAyeNumbers(sure); 
      np_aye.setMinValue(1); 
      np_aye.setMaxValue(getAye.length); 
      np_aye.setDisplayedValues(getAye);  
     } 
    }); 

    //np_sure.setOnLongPressUpdateInterval(intervalMillis); 

    np_aye.setOnValueChangedListener(new OnValueChangeListener() { 

     @Override 
     public void onValueChange(NumberPicker picker, int oldValue, int newValue) { 

      Toast.makeText(getBaseContext(), String.valueOf(newValue),Toast.LENGTH_SHORT).show(); 
      tv_besm.setText(R.string.besm_2); 
      result = db.retrieveAye(sure,newValue,db.TABLE); 
      tv_aye.setText(result.getAye()); 
      tv_tarjome.setText(result.getTarjome()); 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 
    if(requestCode == 1){ 
     if(resultCode == RESULT_OK){ 
      String a = data.getStringExtra("aye"); 
      tv_aye.setText(a); 
      //tv_aye.setText(data.getStringExtra("aye")); 
      tv_tarjome.setText(data.getStringExtra("tarjome")); 
     } 
    } 
} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    db.close(); 
} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    db.openDatabase(); 

} 


@Override 
protected void onRestart() { 
    super.onRestart(); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // TODO Auto-generated method stub 
    getMenuInflater().inflate(R.menu.splash, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // TODO Auto-generated method stub 
/* int id = item.getItemId(); 
    if(id==R.id.about){ 

     Dialog d = new Dialog(Main_Activity.this); 
     d.setContentView(R.layout.about_dialoge); 
     d.setTitle("درباره ما"); 
     d.show(); 
     TextView tvLink = (TextView) findViewById(R.id.tv_link); 

    } */ 
    return super.onOptionsItemSelected(item); 
} 

}

и моя поисковая активность, как это:

public class Search extends ListActivity { 

private int selectedRadio=1; 

String showAye,showTarjome,showSureNo,showAyeNo; 
List<Pair_aye_tarjome> searchList; 
ListView list; 
DBOpenHelper db; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.search); 

    //------------------Giving References to widgets---------------------- 

    final EditText etSearch = (EditText) findViewById(R.id.etSearch); 
    Button btnSearch = (Button) findViewById(R.id.btnSearch); 
    RadioGroup rg = (RadioGroup) findViewById(R.id.rgSearch); 
    RadioButton rbMatn = (RadioButton) findViewById(R.id.rbMatn); 
    RadioButton rbTarjome = (RadioButton) findViewById(R.id.rbTarjome); 

    db = new DBOpenHelper(getBaseContext()); 
    try {    
      db.openDatabase(); 

     }catch(SQLException sqle){ 
      throw sqle; 
     } 

    //-------------------Radio Group ------------------------------------- 

     rg.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(RadioGroup rg, int checkedID) { 

      if(checkedID == R.id.rbMatn){ 
       selectedRadio = 0; 
      } else if(checkedID == R.id.rbTarjome){ 
       selectedRadio = 1; 
      } 
     } 
    }); 

    //-------------------Search------------------------------------------- 

     btnSearch.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if(etSearch.getText().toString().equals("")){ 
       Toast.makeText(getBaseContext(), "لطفا واژه مورد نظر را وارد کنید.", Toast.LENGTH_LONG).show(); 
      } 
      else { 
      String word = etSearch.getText().toString(); 
      searchList = db.wordSearch(word,selectedRadio); 
      refresh(); 
      } 
     } 
    }); 
} 

     //-------------------List Item Click Listener -------------------------- 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 
    super.onListItemClick(l, v, position, id); 

    String showAye = searchList.get(position).getBaerab(); 
    String showTarjome = searchList.get(position).getTarjome(); 
    String showSureNo = searchList.get(position).getSure(); 
    String showAyeNo = searchList.get(position).getAye(); 
    Intent mainIntent = new Intent(this,Main_Activity.class); 
    mainIntent.putExtra("aye", showAye); 
    mainIntent.putExtra("tarjome", showTarjome); 
    mainIntent.putExtra("sureNo", showSureNo); 
    mainIntent.putExtra("ayeNo",showAyeNo); 
    setResult(RESULT_OK, mainIntent); 
    db.close(); 
    finish(); 

} 

//---------------------Declaration Refresh()---------------------- 
private void refresh(){ 
    ArrayAdapter<Pair_aye_tarjome> adapter; 
    adapter = new ArrayAdapter<Pair_aye_tarjome>(Search.this, android.R.layout.simple_list_item_1,searchList); 
    setListAdapter(adapter); 

} 


@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    db.close(); 
} 


@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    db.openDatabase(); 
} 

}

Спасибо.

мой LogCat, как показано ниже:

12-18 03:44:04.309: E/AndroidRuntime(1418): FATAL EXCEPTION: main 
    12-18 03:44:04.309: E/AndroidRuntime(1418): java.lang.RuntimeException: Failure delivering result  esultInfo{who=null, request=1, result=-1, data=Intent { cmp=ir.ommolketab/.Main_Activity (has extras) }} to activity {ir.ommolketab/ir.ommolketab.Main_Activity}: java.lang.NullPointerException 
12-18 03:44:04.309: E/AndroidRuntime(1418):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3367) 
12-18 03:44:04.309: E/AndroidRuntime(1418):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3410) 
12-18 03:44:04.309: E/AndroidRuntime(1418):  at android.app.ActivityThread.access$1100(ActivityThread.java:141) 
12-18 03:44:04.309: E/AndroidRuntime(1418):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1304) 
12-18 03:44:04.309: E/AndroidRuntime(1418):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-18 03:44:04.309: E/AndroidRuntime(1418):  at android.os.Looper.loop(Looper.java:137) 
12-18 03:44:04.309: E/AndroidRuntime(1418):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
12-18 03:44:04.309: E/AndroidRuntime(1418):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-18 03:44:04.309: E/AndroidRuntime(1418):  at java.lang.reflect.Method.invoke(Method.java:525) 
12-18 03:44:04.309: E/AndroidRuntime(1418):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
12-18 03:44:04.309: E/AndroidRuntime(1418):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
12-18 03:44:04.309: E/AndroidRuntime(1418):  at dalvik.system.NativeStart.main(Native Method) 
12-18 03:44:04.309: E/AndroidRuntime(1418): Caused by: java.lang.NullPointerException 
12-18 03:44:04.309: E/AndroidRuntime(1418):  at ir.ommolketab.Main_Activity.onActivityResult(Main_Activity.java:160) 
12-18 03:44:04.309: E/AndroidRuntime(1418):  at android.app.Activity.dispatchActivityResult(Activity.java:5322) 
12-18 03:44:04.309: E/AndroidRuntime(1418):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3363) 
12-18 03:44:04.309: E/AndroidRuntime(1418):  ... 11 more 
+0

HI, когда вы отлаживаете, уверены ли вы, что ваш onListItemClick вызывается? Кроме того, вы уверены, что onActivityResult никогда не называется? Может быть, он вызван, но один из тестов (requestCode == 1, resultCode == RESULT_OK) завершает работу –

+0

, установив точки останова, обнаружив, что 'onListItemClick' вызывается, поскольку 4 значения String имеют данные. но как я могу проверить ** (requestCode == 1, resultCode == RESULT_OK) **? @Toaster –

+0

сейчас я получил ошибку: 'java.lang.RuntimeException: Ошибка доставки результата ResultInfo {who = null, request = 1, result = -1, data = Intent {cmp = ir.ommolketab/.Main_Activity (имеет дополнительные функции) }} в действие {ir.ommolketab/ir.ommolketab.Main_Activity}: java.lang.NullPointerException. ' –

ответ

0

, наконец, я нашел проблему:

вместо

final TextView tv_aye = (TextView) findViewById(R.id.tv_aye); 

Я Шоуда определить TextView глобально сверху onCreate()

TextView tv_aye,tv_tarjome; 

final ключевое слово не позволяет заменять текст. Вот и все.

0

По вашему LogCat, OnActivityResult вызывается. См.

Caused by: java.lang.NullPointerException 12-18 03:44:04.309: E/AndroidRuntime(1418): at ir.ommolketab.Main_Activity.onActivityResult(Main_Activity.java:160)

Ошибка в строке 160 и исключение нулевого указателя. Может быть, ваши TextViews не инициализируются в это время.

проверка линии 160

0

ИТАК ваша проблема: у вас есть нулевое значение в методе вы onActivityResult, в строке 160.

Вы сказали, что data.getStringExtra("aye") на линии 160. Это означает, что ваши данные Bundle не содержит ключа «aye», или ему присваивается нулевое значение.

В вашей функции SearchActivity перейдите в onListItemClick и проверьте, помещаете ли строки в Bundle. Я предполагаю, что хотя бы одна строка была нулевой. Например, что делает showAye содержит, когда вы делаете mainIntent.putExtra("aye", showAye);?

+0

Я проверил 'showAye' и' showTarjome' точки останова. оба из них имеют данные, но в строке 161 'tv_aye.setText (a);' он сбой. –

+0

Он показывает: 'mainIntent = Intent (id = d8300320 ...), mAction = null, .. Intent {cmp = ir.ommolketab/.Main_Activity (имеет дополнительные функции)}' –

+0

is tv_aye null? –

1

Основной проблемой является то, как вы создаете обратный Intent, вы должны сделать следующее

Intent mainIntent = = getIntent(); 
mainIntent.putExtra("aye", showAye); 
mainIntent.putExtra("tarjome", showTarjome); 
mainIntent.putExtra("sureNo", showSureNo); 
mainIntent.putExtra("ayeNo",showAyeNo); 
setResult(RESULT_OK, mainIntent); 
db.close(); 
finish(); 
+0

Он будет работать, 100%, его протестирован. –

+0

жаль, что это не сработало для меня !! :( –

+0

Это означает, что вы возвращаете нулевое значение в «tarjome». I.e значение showTarjome равно null в вашей активности поиска. –

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