0

我是 Android 新手,我的应用程序从数据库中检索数据onCreate()并将其显示在 2 TextViews(tv_aye , tv_tarjome)上,然后通过单击btn_search我调用我的子活动(搜索活动)StartActivityForResult()。在搜索活动中有一个显示搜索结果的列表视图。通过单击每个列表项,它应该返回父活动并将TextViews替换为所选列表项的内容。问题是当它通过将数据发送回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
4

4 回答 4

1

主要问题是您生成返回意图的方式,您应该执行以下操作

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();   
于 2013-12-18T09:31:06.200 回答
0

根据您的 logcat,OnActivityResult正在调用。看

引起: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 行

于 2013-12-18T09:06:01.903 回答
0

好的,所以您的问题是:您的 onActivityResult 方法中有一个空值,在第 160 行。

您说的data.getStringExtra("aye")是在第 160 行。这意味着您的 Bundle 数据不包含键“aye”,或者为其分配了一个空值。

在 SearchActivity 中,转到 onListItemClick 并检查是否将字符串放入 Bundle。我猜至少有一个字符串是空的。例如,showAye你做的时候包含什么mainIntent.putExtra("aye", showAye);

于 2013-12-18T09:17:45.593 回答
0

最后我发现了问题:

代替

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

我应该在onCreate()之上全局定义 TextView

TextView tv_aye,tv_tarjome;

final关键字不允许文本替换。就是这样。

于 2013-12-18T17:05:13.080 回答