2012-05-14 52 views
1

我的活动被命名为BlacklistAddActivity。
UI元素:EditText editText,Button btn1。当我点击btn1时,它会启动联系人列表活动,我可以从联系人列表中选择一个联系人。然后将联系信息发送回BlacklistAddActivity,并通过editText.setText(contact.name)将联系人的姓名设置为text1。恢复时,EditText不显示任何内容。 (由android系统销毁的活动)

问题是,有时候,在联系人列表中,如果我做了一些操作:从最近的应用程序窗口中输入拨号程序(长按主键),然后拨打电话等等......正如我们所知,android会检查内存决定是否销毁活动堆栈。如果内存不足,将会破坏后台活动,包括BlacklistActivity。
现在,恢复到联系人列表并选择一个联系人,恢复到BlacklistActivity,它将被重新创建。我可以在onActivityResult()上正确地获取联系人的信息。然后,editText.setText(contact.name)。奇怪的是:UI上显示的editText仍然是空的。

下面是我的代码:(不完全)

public class BlacklistAddActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener { 
static final boolean DBG = true; 
private static final String TAG = "BlacklistAddActivity"; 
private static final String KEY_MATCH_CRITERIA = "match_criteria"; 

private SharedPreferences mSharedPreferences; 
private ListPreference mCriteria; 

private static final int CONTACT_ITEM = 0; 
private static final int LOGS_ITEM = 1; 

private static final String NUM_PROJECTION[] = { Phone.DISPLAY_NAME, Phone.NUMBER }; 

protected static final Intent CONTACT_IMPORT_INTENT; 
static { 
    CONTACT_IMPORT_INTENT = new Intent(Intent.ACTION_GET_CONTENT); 
    CONTACT_IMPORT_INTENT.setType(Phone.CONTENT_ITEM_TYPE); 
} 

private Context mContext; 
private EditText editText; 
private ImageButton searchButton; 
private TwSoftkeyItem mLeftSoftkey, mRightSoftkey; 
private AlertDialog mSearchDialog = null; 

private InputMethodManager imm; 

private boolean updateMode; 
private String mNumber; 
private int mMatchCriteria; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    initTitle(); 
    super.onCreate(savedInstanceState); 
      Log.i(TAG, "onCreate()"); 
    setContentView(R.layout.blacklist_number_layout); 
    addPreferencesFromResource(R.xml.blacklist_add_num_prefs); 
    mSharedPreferences = getPreferenceScreen().getSharedPreferences(); 
    mContext = getBaseContext(); 

    mCriteria = (ListPreference) findPreference(KEY_MATCH_CRITERIA); 
    editText = (EditText) findViewById(R.id.edit_text); 
    editText.requestFocus(); 
    searchButton = (ImageButton) findViewById(R.id.search_button); 
    mLeftSoftkey = (TwSoftkeyItem) findViewById(R.id.skleft); 
    mRightSoftkey = (TwSoftkeyItem) findViewById(R.id.skright); 

    initValue(); 
    initEvent(); 
    imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); 

    handler.postDelayed(new Runnable() { 
     public void run() { 
      imm.showSoftInput(editText, 1); 
     } 
    }, 200); 
} 

private void initTitle() { 
    String str = getIntent().getStringExtra("FROM"); 
    if (str != null) { 
     if (DBG) Log.i(TAG, "initTitle() => from: " + str); 
     if (str.equals("msg")) { 
      setTitle(R.string.list_msg_block_num); 
     } else { 
      setTitle(R.string.list_call_block_num); 
     } 
    } 
} 

private void initValue() { 
    updateMode = getIntent().getBooleanExtra("UPDATE_MODE", false); 
    Log.i(TAG, "the updatemode is: "+ updateMode); 
    if (updateMode == true) { //from Edit 
     mNumber = getIntent().getStringExtra("NUMBER"); 
     mMatchCriteria = getIntent().getIntExtra("CRITERIA", 0); 

     editText.setText(mNumber); 
     editText.setSelection(mNumber.length()); 
     mCriteria.setValueIndex(mMatchCriteria); 
     mCriteria.setSummary(mCriteria.getEntry()); 
    } else { // from Add 
     mCriteria.setValueIndex(0); 
     mCriteria.setSummary(mCriteria.getEntry()); 
    } 
} 

private void initEvent() { 
    searchButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      alertDialogSearch(); 
     } 
    }); 

    editText.setOnFocusChangeListener(new OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean focused) { 
      if (focused == true) { 
       handler.postDelayed(new Runnable() { 
        public void run() { 
         imm.showSoftInput(editText, 1); 
        } 
       }, 200); 
      } else { 
       imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); 
      } 
     } 
    }); 

    editText.setOnKeyListener(new OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER && event.getAction() == KeyEvent.ACTION_UP) { 
       editText.requestFocus(); 
       return true; 
      } 
      return false; 
     } 
    }); 

    mLeftSoftkey.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(); 
      intent.putExtra("NUMBER", editText.getText().toString()); 
      intent.putExtra("CRITERIA", mCriteria.findIndexOfValue(mCriteria.getValue())); 
      setResult(RESULT_OK, intent); 
      finish(); 
     } 
    }); 

    mRightSoftkey.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      setResult(RESULT_CANCELED, null); 
      finish(); 
     } 
    }); 
} 

    @Override 
public void onRestoreInstanceState(Bundle savedInstanceState) 
{ 
     if(DBG){ 
      if(null != editText) 
      Log.d(TAG, "onRestoreInstanceState: Edit Text is: "+editText.getText().toString()); 
     } 
     super.onRestoreInstanceState(savedInstanceState); 

     if(DBG){ 
      if(null != editText) 
      Log.d(TAG, "onRestoreInstanceState: Edit Text is: "+editText.getText().toString()); 
     } 
} 
@Override 
protected void onResume() { 
    super.onResume(); 
    Log.i(TAG, "onResume()"); 
    if(null != editText) 
     if (DBG) Log.d(TAG, "onResume() Edit Text is: "+editText.getText().toString()); 
    mSharedPreferences.registerOnSharedPreferenceChangeListener(this); 
    mCriteria.setSummary(mCriteria.getEntry()); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    mSharedPreferences.unregisterOnSharedPreferenceChangeListener(this); 
    if (mSearchDialog != null) { 
     mSearchDialog.dismiss(); 
     mSearchDialog = null; 
    } 
} 

@Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    if (DBG) Log.v(TAG, "onSharedPreferenceChanged(), key: " + key); 

    if (KEY_MATCH_CRITERIA.equals(key)) { 
     if (mCriteria.getEntry() == null) { 
      mCriteria.setValueIndex(0); 
     } 
     mCriteria.setValue(sharedPreferences.getString(key, mCriteria.getEntry().toString())); 
     mCriteria.setSummary(mCriteria.getEntry()); 
     if (DBG) Log.v(TAG, "setValue: " + mCriteria.getEntry().toString()); 
    } 
} 

private Handler handler = new Handler() { 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
      case 0: 
       System.out.println("DONE"); 
       break; 
     } 
    } 
}; 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    String output = ""; 
    switch (requestCode) { 
     case CONTACT_ITEM: 
      if (resultCode != RESULT_OK) { 
       Log.e(TAG, "onActivityResult() => canceled"); 
      } else { 
       Cursor cursor = getContentResolver().query(data.getData(), NUM_PROJECTION, null, null, null); 
       if (cursor != null) { 
        if (cursor.moveToFirst()) { 
         output = cursor.getString(1); 
         if (DBG) Log.d(TAG, "onActivityResult() => contact output: " + output); 
         if (Utils.isValidNum(mContext, output)) { 

          editText.setText(output); 
          if (DBG) Log.d(TAG, "onActivityResult() Edit Text is: "+editText.getText().toString()); 
         } 
        } 
        cursor.close(); 
       } 
      } 
      break; 

     case LOGS_ITEM: 
      if (resultCode == RESULT_OK) { 
       output = data.getStringExtra("NUMBER"); 
       if (DBG) Log.d(TAG, "onActivityResult() => logs output: " + output); 
       if (Utils.isValidNum(mContext, output)) { 
        editText.setText(output); 
       } else { 
        output = null; 
        Utils.displayToast(mContext, getString(R.string.vip_msg_wrong_number)); 
       } 
      } 
      break; 
    } 
    handler.postDelayed(new Runnable() { 
     public void run() { 
      imm.showSoftInput(editText, 1); 
     } 
    }, 200); 

    if (output != null && output.length() > 0) { 
     editText.requestFocus(); 
     editText.setSelection(output.length()); 
    } 
} 

private void alertDialogSearch() { 
    AlertDialog.Builder ad = new AlertDialog.Builder(this); 
    ad.setTitle(R.string.title_search).setItems(R.array.dialog_search, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      Intent intent; 
      switch (which) { 
       case CONTACT_ITEM: 
        startActivityForResult(CONTACT_IMPORT_INTENT, CONTACT_ITEM); 
        break; 
       case LOGS_ITEM: 
        intent = new Intent("contacts.com.sec.android.app.dialertab.calllog.LogsListActivity"); 
        intent.putExtra("OPTION", 1); 
        startActivityForResult(intent, LOGS_ITEM); 
        break; 
      } 
      imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); 
     } 
    }); 
    mSearchDialog = ad.show(); 
} 

}

+0

你的代码在哪里? – candyleung

+0

对不起,稍等片刻,它提示我的代码格式不正确,无法发布。 – andy

+0

任何人都可以帮我吗?我想也许这是Android的错。 – andy

回答

4

Android为您的活动不会自动备份所有数据,当它被摧毁。您必须在数据被破坏之前手动备份数据,并在重新创建活动时恢复数据。

要备份您的数据,您必须重写此方法。 (你的活动被销毁之前它将被调用。)

@Override 
protected void onSaveInstanceState(Bundle savedInstanceState) 
{ 
    super.onSaveInstanceState(savedInstanceState); 
    savedInstanceState.putString("key", value); //save your data in key-value pair 
} 

要恢复你的数据,你必须覆盖此方法。如果你的文本未设置(这将您的活动恢复之前被调用。)

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) 
{ 
    super.onRestoreInstanceState(savedInstanceState); 
    value = savedInstanceState.getString("key"); //retrieve your data using its corresponding key 
} 
+0

但是我可以从联系人列表活动返回的Intent中获得结果。例如:意向数据。数据包含联系人的姓名并且该名称被设置为editText。 (请参阅代码)。我登录并发现该值不为空。但为什么editText不能显示字符串? – andy

+0

也许我不清楚表达自己的想法。关键点不是我的EditText丢失的价值。但恢复时,新设置的文本根本不显示。但是,如果活动没有被破坏,那也没关系。 – andy

+0

@andy:我更新了我的答案。如果是这种情况,则必须手动备份数据并在活动恢复时进行恢复。 – Arci

0

/显示正确,你应该看看你onCreate()onResume()onRestoreInstanceState()实施密切关注。 所以从的答案arci是我也会在这种情况下回答。

你说这是第一次工作,也工作,如果Activity不会被杀害。但是当Activity被杀死并重新创建时,它不起作用。这听起来像是你在错误引用一些point.Especially工作,当您使用监听器会发生这种情况很容易
你应该进入调试模式,并检查您的ActivityEditText实例(通过存储ADRESS)是相同的/每当你访问它时都正确。

我不会真的看到你的代码的问题,但它必须是这样的。

注意:您使用startActivity()每次,进入横向/纵向模式或其他什么叫onCreate()你可能会得到一个新的Activity实例。

注意二:每次调用onCreate()时,最有可能调用setContentView()最终得到新膨胀/创建的视图。这意味着你的EditText和其他视图将成为一个新的实例。

+0

http://stackoverflow.com/a/43890541/785576试试这个 – saravanan