2013-05-06 16 views
9

Próbuję uzyskać dostęp do aplikacji Java i Eclipse, aby tworzyć aplikacje (obecnie używające B4A, ale chcę rozszerzyć dostępne zasoby i możliwość tworzenia bibliotek)IndexOutOfBoundsException: charAt: 0> = długość 0 w niektórych wersjach Androida

Podczas próby zaimplementowania okna dialogowego z fragmentami, podążyłem za przykładem here.

Wciąż dostaję

05-06 13:40:21.060: E/SensorManager(18538): thread start 
05-06 13:40:21.105: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 

Próbowałem debugowanie, ale debuger nie zatrzymuje się na jakiekolwiek błędy (i jestem nowy na tym debuggera, więc nie wiem, w jaki sposób ustalić, że jeden).

Czy ktoś widzi, gdzie wyjątek jest spowodowany? (Wystarczy upewnić się, że nie był to tłusty palec w dowolnym miejscu, Pobrałem poprzez git, i próbował go i otrzymał dokładnie te same błędy w LogCat)

Oto moja mainActivity.java:

package com.example.fragmenttest; 
import com.example.fragmenttest.EditNameDialog.EditNameDialogListener; 
import android.os.Bundle; 
import android.app.Activity; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.view.Menu; 
import android.widget.Toast; 

public class MainActivity extends FragmentActivity implements EditNameDialogListener { 

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

private void showEditDialog() { 
    FragmentManager fm = getSupportFragmentManager(); 
    EditNameDialog editNameDialog = new EditNameDialog(); 
    editNameDialog.show(fm, "fragment_edit_name"); 
} 

@Override 
public void onFinishEditDialog(String inputText) { 
    Toast.makeText(this, "Hi, " + inputText, Toast.LENGTH_SHORT).show(); 
} 
} 

a oto EditNameDialog.java:

package com.example.fragmenttest; 

import android.support.v4.app.DialogFragment; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.WindowManager.LayoutParams; 
import android.view.inputmethod.EditorInfo; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.TextView.OnEditorActionListener; 


public class EditNameDialog extends DialogFragment implements OnEditorActionListener { 

public interface EditNameDialogListener { 
    void onFinishEditDialog(String inputText); 
} 

private EditText mEditText; 

public EditNameDialog() { 
    // Empty constructor required for DialogFragment 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_edit_name, container); 
    mEditText = (EditText) view.findViewById(R.id.txt_your_name); 
    getDialog().setTitle("Hello"); 

    // Show soft keyboard automatically 
    mEditText.requestFocus(); 
    getDialog().getWindow().setSoftInputMode(
      LayoutParams.SOFT_INPUT_STATE_VISIBLE); 
    mEditText.setOnEditorActionListener(this); 

    return view; 
} 

@Override 
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
    if (EditorInfo.IME_ACTION_DONE == actionId) { 
     // Return input text to activity 
     EditNameDialogListener activity = (EditNameDialogListener) getActivity(); 
     activity.onFinishEditDialog(mEditText.getText().toString()); 
     this.dismiss(); 
     return true; 
    } 
    return false; 
} 
} 

i mój String plik zasobów:

<?xml version="1.0" encoding="utf-8"?> 

<resources> 

    <string name="app_name">fragmentTest</string> 
    <string name="hint_value">hint</string> 
    <string name="your_name">Your name</string> 

</resources> 

Kompletny StackTrace z LogCat: (nie różni się u góry)

05-06 13:40:21.060: E/SensorManager(18538): thread start 
05-06 13:40:21.105: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.105: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.110: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.200: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.205: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.205: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.210: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.215: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.275: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.275: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.300: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.300: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.300: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.470: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.470: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.725: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 
05-06 13:40:21.725: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0 

Edit: biegł w moim Galaxy S3 działa 4.1.2. Kiedy wypróbowany na moim Galaxy SL z systemem 2.3.4, absolutnie nie ma problemów z logcat. To mówi mi, że jest to związane z platformą, ale w moich wyszukiwaniach nie widziałem niczego związanego z wersją Androida. Pytanie uzupełniające, czy ktoś wie o problemie z JB (lub cokolwiek innego, o czym wspomniałem), który może wyjaśnić ten błąd?

+0

po ukończeniu stacktrace – njzk2

+0

Prześlij dane wyjściowe logcat. – Neoh

+0

Masz do tego rozwiązanie? –

Odpowiedz

1

Prawdopodobnie wyjątek jest zgłaszany przez android.text.SpannableStringBuilder # charAt (int).

/** 
* Return the char at the specified offset within the buffer. 
*/ 
public char charAt(int where) { 
    int len = length(); 
    if (where < 0) { 
     throw new IndexOutOfBoundsException("charAt: " + where + " < 0"); 
    } else if (where >= len) { 
     throw new IndexOutOfBoundsException("charAt: " + where + " >= length " + len); 
    } 

    if (where >= mGapStart) 
     return mText[where + mGapLength]; 
    else 
     return mText[where]; 
} 

Domyślam się, że w twoim kodzie wykonywana jest jakaś operacja niebezpieczna dla wątków.

Na przykład warto spróbować przenieść showEditDialog() z onCreate (Bundle) do onResume(). Jeśli to nie rozwiąże problemu, następnym krokiem jest sprawdzenie EditNameDialog # onCreateView.

Android API ma wiele metod onCreateXxx, a istnieją udokumentowane i nieudokumentowane rzeczy, których powinniśmy unikać w ramach metod.

Powiązane problemy