2011-07-04 37 views
0

我放棄了。我使用了很多子字符串,但是這次我無法使它工作。我正在從微調器中選擇一個聯繫人(填充了手機的聯繫人),我想要所選聯繫人的姓。部分代碼:Android的子力關閉

公共類MyOnItemSelectedListener實現OnItemSelectedListener {

public void onItemSelected(AdapterView<?> parent, 
    View view, int pos, long id) { 
    selectedname = parent.getItemAtPosition(pos).toString(); 
    sn = selectedname .indexOf(' '); 
    String selectedname2= selectedname.substring(1, 3); //force close line 
} 

public void onNothingSelected(AdapterView parent) { 

} 

}

的selectedname和sn變量返回的實際值。 例如在

BtnOK = (Button)findViewById(R.id.Button01); 
BtnOK.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     Toast.makeText(Alarm.this, "selname: " + selectedname + "-" + sn, Toast.LENGTH_LONG).show(); 

    } 
}); 

回報selname:安娜 - 4

但是,如果我包括String selectedname2= selectedname.substring(1, 3);線,迫使其關閉。 任何想法?

的logcat:

07-04 17:05:32.140: ERROR/AndroidRuntime(280): FATAL EXCEPTION: main 
07-04 17:05:32.140: ERROR/AndroidRuntime(280): java.lang.StringIndexOutOfBoundsException 
07-04 17:05:32.140: ERROR/AndroidRuntime(280):  at java.lang.String.substring(String.java:1579) 
07-04 17:05:32.140: ERROR/AndroidRuntime(280):  at com.bfarago.app.Alarm$MyOnItemSelectedListener.onItemSelected(Alarm.java:577) 
07-04 17:05:32.140: ERROR/AndroidRuntime(280):  at android.widget.AdapterView.fireOnSelected(AdapterView.java:864) 
07-04 17:05:32.140: ERROR/AndroidRuntime(280):  at android.widget.AdapterView.access$200(AdapterView.java:42) 
07-04 17:05:32.140: ERROR/AndroidRuntime(280):  at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:830) 
07-04 17:05:32.140: ERROR/AndroidRuntime(280):  at android.os.Handler.handleCallback(Handler.java:587) 
07-04 17:05:32.140: ERROR/AndroidRuntime(280):  at android.os.Handler.dispatchMessage(Handler.java:92) 
07-04 17:05:32.140: ERROR/AndroidRuntime(280):  at android.os.Looper.loop(Looper.java:123) 
07-04 17:05:32.140: ERROR/AndroidRuntime(280):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
07-04 17:05:32.140: ERROR/AndroidRuntime(280):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-04 17:05:32.140: ERROR/AndroidRuntime(280):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-04 17:05:32.140: ERROR/AndroidRuntime(280):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
07-04 17:05:32.140: ERROR/AndroidRuntime(280):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
07-04 17:05:32.140: ERROR/AndroidRuntime(280):  at dalvik.system.NativeStart.main(Native Method) 

線577 String selectedname2= selectedname.substring(1, 3);

這條線將是String selectedname2= selectedname.substring(1, sn);,我只是想弄清楚什麼是錯的。

EDIT2:全碼:

public class Alarm extends Activity { 

    public ArrayList<String> myArr = new ArrayList<String>(); 
    String contactName; 
    int spaceIndex, spaceLastIndex, spaceIndex2; 
    String selectedname; 
    String selectedname2; 
    int sn; 
    int selnamelength; 
    String[] words; 
    String surname; 

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

contactName = null; 
Context context = getApplicationContext(); 
Cursor cursor = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

while (cursor.moveToNext()) 
{ 
    contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
    spaceIndex = contactName.indexOf(' '); 
    spaceLastIndex = contactName.lastIndexOf(' '); 
    if (spaceIndex > 0)  {myArr.add(contactName);} 
    else if (spaceLastIndex > 0)  {myArr.add(contactName);} 
    else  {myArr.add(contactName);} 
} 
myArr.add(""); 
Collections.sort(myArr); 

Spinner sp1 = (Spinner)findViewById(R.id.Spinner01); 
final ArrayAdapter adapter3 = new ArrayAdapter(this, android.R.layout.simple_spinner_item, myArr); 
sp1.setAdapter(adapter3); 
sp1.setOnItemSelectedListener(new MyOnItemSelectedListener()); 

} 

public class MyOnItemSelectedListener implements OnItemSelectedListener { 

    public void onItemSelected(AdapterView<?> parent, 
     View view, int pos, long id) { 
     selectedname = parent.getItemAtPosition(pos).toString(); 
     sn = selectedname.indexOf(' '); 
     selnamelength = selectedname.length(); 
     selectedname2 = selectedname.substring(1, 3); //force closes 

     if (!selectedname.equals("")) 
     { 
      Toast.makeText(Alarm.this, "selectedname.length = " + selnamelength, Toast.LENGTH_LONG).show(); //This is working 
     } 

    } 

    public void onNothingSelected(AdapterView parent) { 

    } 
} 
} 

通過,分裂()函數的工作方式......

+0

添加堆棧跟蹤,請 – mibollma

+0

你能更具體? (用於分割字符串string.split(「」)似乎更好)。 – gregory561

回答

0

你需要這個?

String selectedname2= selectedname.substring(sn, selectedname.length()); 

也嘗試記錄您的異常,看看LogCat或放一個try/catch塊,並記錄您的異常給我們更多的細節。

[編輯]

請複製你的所有活動編碼,selectedname VAR是在活動範圍內聲明。嘗試在方法範圍中聲明這個var,看起來這個var在你的活動的另一部分被修改。

你得到一個IndexOutOfBoundException: enter image description here

所以原因是因爲selectedname含量線#577之前改變。首先試圖聲明該變種的方法的範圍,然後複製粘貼&您充分活動代碼,所以我能看到使用這種變種。 請記住,子字符串方法共享string's backing array,所以對子字符串的任何修改都會影響您的原始字符串,然後是您的字符串數組。

+0

有什麼想法?昨天我幾個小時一直在掙扎着。 selectedname變量是有效的,如果我包含selectedname.substring(sn,selectedname。長度());在祝詞中,它給了我正確的價值,但是如果我用它作爲變量,它會強制關閉。這真的很煩人 – erdomester

+0

我的評論已更新,也許這可以給你任何想法... – matiasnj

+0

方法範圍?對不起,那是什麼?我在onCreate()方法中聲明瞭它,但我不認爲它應該在那裏聲明,因爲它只有在我選擇了微調器中的一個項目後纔得到一個值。所以在onCreate方法中它的值爲null。我添加了完整的代碼。 – erdomester

1

試試這個代碼:

String selectedname2 = new String(selectedname.substring(1, 3));