Android 在某些情况下崩溃
Android is crashing in certain situation
我正在开发 android 应用程序。我想通过自制 class ( entryClass ) 显示数据。列表由 recyclerLayout 表示,其中包括诸如此类的 cardView 列表。
这个(Lorem Ipsum ...)的描述将是 200 个字符 + 到最后一个单词的末尾(例如,如果第 200 个字符正好在单词的中间,其余部分将被打印)到为此,我做了一个新方法:
public static String cutText(String text){
String temp="";
StringBuilder build=new StringBuilder(temp);
int i=0;
while((i>200 || text.charAt(i)!=' ') && i<text.length())
{
if(text.charAt(i)!='\n'){
build.append(text.charAt(i));}
else {build.append(text.charAt(' '));}
i++;
}
return build.toString();
}
但是当我使用此方法时,应用程序在 运行 时崩溃。
这是添加此方法的部分:
public void onBindViewHolder(final ViewHolder holder, int position) {
//creating an cardView
holder.mItem = mValues.get(position);
holder.mAuthorView.setText(mValues.get(position).author);
holder.mDateView.setText(mValues.get(position).date);
holder.mContentView.setText(cutText(mValues.get(position).content));
holder.mImageView.setImageResource(R.drawable.sadness);
当带有 cutText 方法的行更改为不包含它时,一切正常。
我希望我包含了所有重要的内容。
最好的祝福!
编辑:
崩溃日志:
12-21 15:24:05.062 10574-10574/pl.spicyproject.quickstart E/AndroidRuntime: FATAL EXCEPTION: main
Process: pl.spicyproject.quickstart, PID: 10574
java.lang.StringIndexOutOfBoundsException: length=3; index=3
at java.lang.String.charAt(Native Method)
at pl.spicyproject.quickstart.Home.cutText(Home.java:201)
at pl.spicyproject.quickstart.Home$SimpleItemRecyclerViewAdapter.onBindViewHolder(Home.java:151)
at pl.spicyproject.quickstart.Home$SimpleItemRecyclerViewAdapter.onBindViewHolder(Home.java:129)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5217)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5250)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4487)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4363)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1961)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1370)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1333)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:562)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2900)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3071)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1732)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1497)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1037)
at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:747)
at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1156)
at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:760)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1043)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678)
at android.view.View.layout(View.jav
12-21 15:24:07.450 10574-10574/pl.spicyproject.quickstart I/Process:发送信号。 PID:10574 SIG:9
您需要先在 while 循环条件中检查字符串长度:
while(i<text.length() && (i>200 || text.charAt(i)!=' '))
因为否则它可能会尝试调用 text.charAt(i)
以获得超出字符串末尾的 i
。
还有:
build.append(text.charAt(' '));
这仅在 text
中至少有 33 个字符时有效,因为 text.charAt(' ')
在语义上等同于 text.charAt(32)
。
不清楚您到底想做什么,但看起来您正在尝试用空格替换换行符。以下可能更容易:
text.replace('\n', ' ')
对于您的规范,我认为如果您使用类似以下的内容会更清楚,这样可以避免使用 StringBuilder:
String cutText(String text) {
int i = Math.min(200, text.length());
while (i < text.length() && text.charAt(i) != ' ') {
++i;
}
return text.substring(0, i).replace('\n', ' ');
}
我正在开发 android 应用程序。我想通过自制 class ( entryClass ) 显示数据。列表由 recyclerLayout 表示,其中包括诸如此类的 cardView 列表。
这个(Lorem Ipsum ...)的描述将是 200 个字符 + 到最后一个单词的末尾(例如,如果第 200 个字符正好在单词的中间,其余部分将被打印)到为此,我做了一个新方法:
public static String cutText(String text){
String temp="";
StringBuilder build=new StringBuilder(temp);
int i=0;
while((i>200 || text.charAt(i)!=' ') && i<text.length())
{
if(text.charAt(i)!='\n'){
build.append(text.charAt(i));}
else {build.append(text.charAt(' '));}
i++;
}
return build.toString();
}
但是当我使用此方法时,应用程序在 运行 时崩溃。 这是添加此方法的部分:
public void onBindViewHolder(final ViewHolder holder, int position) {
//creating an cardView
holder.mItem = mValues.get(position);
holder.mAuthorView.setText(mValues.get(position).author);
holder.mDateView.setText(mValues.get(position).date);
holder.mContentView.setText(cutText(mValues.get(position).content));
holder.mImageView.setImageResource(R.drawable.sadness);
当带有 cutText 方法的行更改为不包含它时,一切正常。
我希望我包含了所有重要的内容。 最好的祝福! 编辑: 崩溃日志:
12-21 15:24:05.062 10574-10574/pl.spicyproject.quickstart E/AndroidRuntime: FATAL EXCEPTION: main
Process: pl.spicyproject.quickstart, PID: 10574
java.lang.StringIndexOutOfBoundsException: length=3; index=3
at java.lang.String.charAt(Native Method)
at pl.spicyproject.quickstart.Home.cutText(Home.java:201)
at pl.spicyproject.quickstart.Home$SimpleItemRecyclerViewAdapter.onBindViewHolder(Home.java:151)
at pl.spicyproject.quickstart.Home$SimpleItemRecyclerViewAdapter.onBindViewHolder(Home.java:129)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5217)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5250)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4487)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4363)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1961)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1370)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1333)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:562)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2900)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3071)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1732)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1497)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1037)
at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:747)
at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1156)
at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:760)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1043)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
at android.view.View.layout(View.java:16630)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678)
at android.view.View.layout(View.jav
12-21 15:24:07.450 10574-10574/pl.spicyproject.quickstart I/Process:发送信号。 PID:10574 SIG:9
您需要先在 while 循环条件中检查字符串长度:
while(i<text.length() && (i>200 || text.charAt(i)!=' '))
因为否则它可能会尝试调用 text.charAt(i)
以获得超出字符串末尾的 i
。
还有:
build.append(text.charAt(' '));
这仅在 text
中至少有 33 个字符时有效,因为 text.charAt(' ')
在语义上等同于 text.charAt(32)
。
不清楚您到底想做什么,但看起来您正在尝试用空格替换换行符。以下可能更容易:
text.replace('\n', ' ')
对于您的规范,我认为如果您使用类似以下的内容会更清楚,这样可以避免使用 StringBuilder:
String cutText(String text) {
int i = Math.min(200, text.length());
while (i < text.length() && text.charAt(i) != ' ') {
++i;
}
return text.substring(0, i).replace('\n', ' ');
}