IndexOutOfBoundsException: charAt: 0> = длина 0 в некоторых версиях Android

Я пытаюсь использовать Java и Eclipse для создания приложений (в настоящее время использующих B4A, но хочу расширить свои доступные ресурсы и возможность создавать библиотеки)

При попытке реализовать диалог с использованием фрагментов я привел пример здесь .

Я продолжаю получать

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 

Я попытался отлаживать, но отладчик никогда не останавливается на какой-либо ошибке (и я новичок в этом отладчике, поэтому не уверен, как это понять).

Кто-нибудь видит, где возникает исключение? (Чтобы убедиться, что это не был толстый палец нигде, я загрузил его через git и попробовал его, и получил точные ошибки в logcat)

Вот мой 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(); } } 

И вот 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; } } 

И мой файл ресурсов String:

 <?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 из logcat: (не отличается от верхнего)

 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 

Изменить: выполнялся на моем Galaxy S3, работающем на 4.1.2. Когда вы опробовали мой Galaxy SL под управлением 2.3.4, абсолютно никаких проблем с logcat. Это говорит мне, что это связано с платформой, но в моих поисках я не видел ничего, связанного с версией Android. Последующий вопрос, знает ли кто-нибудь о проблеме с JB (или что-то еще, что я упомянул), которое могло бы объяснить эту ошибку?

Вероятно, исключение вызывается 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]; } 

Я предполагаю, что в вашем коде выполняется какая-то небезопасная операция.

Например, может потребоваться переместить showEditDialog () из onCreate (Bundle) в onResume (). Если это не решит проблему, рядом проверяется EditNameDialog # onCreateView.

В Android API есть много методов onCreateXxx, и есть документальные и недокументированные вещи, которые нам следует избегать в рамках методов.