2013-05-06 1 views
9

Sto cercando di utilizzare Java ed Eclipse per creare applicazioni (attualmente utilizzando B4A, ma voglio espandere le mie risorse disponibili e possibilità di creare librerie)IndexOutOfBoundsException: charAt: 0> = length 0 su alcune versioni di Android

Quando si tenta di implementare una finestra di dialogo utilizzando frammenti, ho seguito l'esempio here.

Continuo a ricevere

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 

ho provato il debug, ma il debugger non si ferma mai su qualsiasi errore (e io sono nuovo di questo debugger, quindi non so come a capire che uno).

Qualcuno vede dove viene generata l'eccezione? (Giusto per fare in modo che non era un dito grasso ovunque, ho scaricato tramite il git, e ho cercato fuori, e ha ricevuto esattamente lo stesso errore nel logcat)

Ecco il mio 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(); 
} 
} 

e qui è l'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; 
} 
} 

e la mia String file di risorse:

<?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> 

StackTrace completa da logcat: (non è diverso rispetto alla parte superiore)

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: era in esecuzione sul mio Galaxy S3 in esecuzione 4.1.2. Quando ho provato il mio Galaxy SL con 2.3.4, nessun problema di logcat. Questo mi dice che è relativo alla piattaforma, ma nelle mie ricerche, non ho visto nulla relativo alla versione di Android. Domanda successiva, qualcuno sa di un problema con JB (o qualsiasi altra cosa che ho menzionato) che potrebbe spiegare questo errore?

+0

post stacktrace completo – njzk2

+0

Pubblica l'output logcat. – Neoh

+0

hai una soluzione per questo? –

risposta

1

Probabilmente, l'eccezione viene generata da 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]; 
} 

Immagino che un certo tipo di operazione non sicura del thread venga eseguita nel codice.

Ad esempio, può valere la pena provare a spostare showEditDialog() da onCreate (Bundle) a onResume(). Se non risolve il problema, EditNameDialog # onCreateView è il prossimo a verificare.

L'API Android ha molti metodi onCreateXxx e ci sono cose documentate e non documentate che dovremmo evitare di fare con i metodi.