2011-07-04 12 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変数が真の値を返す実装します。例: アンナ-4

しかし、私はString selectedname2= selectedname.substring(1, 3);行が含まれている場合、それは閉じを強制:

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。 アイデア

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, sn);だろうString selectedname2= selectedname.substring(1, 3);

です。

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を分割する場合はstring.split( "")が良いと思われます)。 – gregory561

答えて

0

あなたはこれを必要ですか?

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

また、LogCatを見たり、try/catchブロックを配置したり、例外を記録して詳細を確認してください。

[編集]

すべてのアクティビティコードをコピーしてくださいは、selectednameのVARは、活動のスコープで宣言されています。メソッドのスコープでこのvarを宣言しようとすると、このvarがアクティビティの別の部分で変更されているようです。

あなたはIndexOutOfBoundExceptionを取得している: selectednameコンテンツはライン#577前に変更されたためenter image description here

だから、理由があります。最初にメソッドのスコープでこのvarを宣言してから、コピー&があなたの完全なアクティビティコードを貼り付けて、このvarがどこに使われているかを見ることができます。 部分文字列メソッドはstring's backing arrayを共有するので、部分文字列内の変更は元の文字列に影響し、文字列配列には影響します。

+0

アイデアはありますか?私は昨日何時間もこれを苦労していた。 selectedname変数が有効で、selectedname.substring(sn、selectedname。長さ());トーストのmsgでそれは私に正しい値を与えますが、私が変数として使用すると強制的に閉じます。それは本当に迷惑です – erdomester

+0

私のコメントは更新されました、おそらくこれはあなたに任意のアイデアを与えることができます... – matiasnj

+0

メソッドの範囲?申し訳ありません、それは何ですか?私はonCreate()メソッドで宣言しましたが、スピナーで項目を選択した後に値が得られるので、宣言する必要はありません。だから、onCreateメソッドでは値はnullです。私は完全なコードを追加しました。 – erdomester

1

は、このコードを試してみてください。

String selectedname2 = new String(selectedname.substring(1, 3)); 
関連する問題