簡體   English   中英

當我嘗試保存滾動位置時應用程序崩潰

[英]Application crashes when i try to save scroll position

我的應用程序有一個活動,其中包含許多文本視圖,這些視圖用於顯示很長的文本塊,因此我將文本分為許多文本視圖。 當我嘗試保存文本的滾動位置以進行方向更改並在應用程序進入后台時保留該位置時,就會出現問題。 但是,當我更改屏幕方向時,應用程序崩潰。

下面是代碼:

Chapter1.xml

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

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/scrollChapter1">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/Chapter1"
            android:textSize="17sp"
            android:padding="10px"
            android:id="@+id/txtChapter1Title"
            />
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dip"
            android:width="0dip"
            android:textSize="16sp"
            android:padding="10px"
            android:text="@string/Chapter1ContentA"
            android:id="@+id/txtChapter1A"
            android:maxLength="9000"
            android:layout_below="@+id/txtChapter1Title"
            />
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="0dip"
            android:width="0dip"
            android:textSize="16sp"
            android:padding="10px"
            android:text="@string/Chapter1ContentB"
            android:id="@+id/txtChapter1B"
            android:maxLength="9000"
            android:layout_below="@+id/txtChapter1A"
            />
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="0dip"
            android:width="0dip"
            android:textSize="16sp"
            android:padding="10px"
            android:text="@string/Chapter1ContentC"
            android:id="@+id/txtChapter1C"
            android:maxLength="9000"
            android:layout_below="@+id/txtChapter1B"
            />
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="0dip"
            android:width="0dip"
            android:textSize="16sp"
            android:padding="10px"
            android:text="@string/Chapter1ContentD"
            android:id="@+id/txtChapter1D"
            android:maxLength="9000"
            android:layout_below="@+id/txtChapter1C"
            />
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="0dip"
            android:width="0dip"
            android:textSize="16sp"
            android:padding="10px"
            android:text="@string/Chapter1ContentE"
            android:id="@+id/txtChapter1E"
            android:maxLength="9000"
            android:layout_below="@+id/txtChapter1D"
            />
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="0dip"
            android:width="0dip"
            android:textSize="16sp"
            android:padding="10px"
            android:text="@string/Chapter1ContentF"
            android:id="@+id/txtChapter1F"
            android:maxLength="9000"
            android:layout_below="@+id/txtChapter1E"
            />
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="0dip"
            android:width="0dip"
            android:textSize="16sp"
            android:padding="10px"
            android:text="@string/Chapter1ContentG"
            android:id="@+id/txtChapter1G"
            android:maxLength="9000"
            android:layout_below="@+id/txtChapter1F"
            />
</RelativeLayout>
</ScrollView>

Chapter1.java:

public class chapter1 extends Activity {
@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.chapter1);
    WindowManager w = getWindowManager();
    Display d = w.getDefaultDisplay();
    if(d.getWidth() > d.getHeight()){
        Log.d("Orientation", "Landscape");
    }else{
        Log.d("Orientation", "Potrait");
    }
}
@Override
protected void onSaveInstanceState(Bundle outState){
    super.onSaveInstanceState(outState);
    final ScrollView scrollView = (ScrollView) findViewById(R.id.scrollChapter1);
    final TextView textView = (TextView) scrollView.getChildAt(0); //Crashes at this line
    final int firstVisibleLineOffset = textView.getLayout().getLineForVertical(scrollView.getScrollY());
    final int firstVisibleCharacterOffset = textView.getLayout().getLineStart(firstVisibleLineOffset);
    outState.putInt("ScrollViewContainerTextViewFirstVisibleCharacterOffset", firstVisibleCharacterOffset);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
    super.onRestoreInstanceState(savedInstanceState);
    final int firstVisibleCharacterOffset = savedInstanceState.getInt("ScrollViewContainerTextViewFirstVisibleCharacterOffset");
    final ScrollView scrollView = (ScrollView) findViewById(R.id.scrollChapter1);
    scrollView.post(new Runnable() {
        @Override
        public void run() {
            final TextView textView = (TextView) scrollView.getChildAt(0);
            final int firstVisibleLineOffset = textView.getLayout().getLineStart(firstVisibleCharacterOffset);
            final int pixelOffset = textView.getLayout().getLineTop(firstVisibleLineOffset);
            scrollView.scrollTo(0, pixelOffset);
        }
    });
}

}

LogCat:

07-18 15:52:39.921      806-806/com.example.ZindaRud D/Orientation﹕ Potrait
07-18 15:52:41.800      806-810/com.example.ZindaRud D/dalvikvm﹕ GC_CONCURRENT freed 155K, 4% free 7169K/7431K, paused 6ms+6ms
07-18 15:52:41.809      806-806/com.example.ZindaRud D/Orientation﹕ Potrait
07-18 15:52:44.500      806-806/com.example.ZindaRud W/TextLayoutCache﹕ computeValuesWithHarfbuzz -- need to force to single run
07-18 15:52:48.760      806-806/com.example.ZindaRud D/AndroidRuntime﹕ Shutting down VM
07-18 15:52:48.760      806-806/com.example.ZindaRud W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x409961f8)
07-18 15:52:48.809      806-806/com.example.ZindaRud E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.TextView
        at com.example.ZindaRud.chapter1.onSaveInstanceState(chapter1.java:31)
        at android.app.Activity.performSaveInstanceState(Activity.java:1113)
        at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1185)
        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3321)
        at android.app.ActivityThread.access$700(ActivityThread.java:122)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1150)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4340)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
        at dalvik.system.NativeStart.main(Native Method)

謝謝大家,修復了ClassCastException,但是現在當方向改變時,它似乎沒有保存並保留滾動位置。

您正在獲取強制轉換異常及其明顯的原因,因為您正在將RelativeLayout強制轉換為TextView行

final TextView textView = (TextView) scrollView.getChildAt(0);

ScrollView的直接子級為0是RelativeLayout,如Layout中所示。

您必須像這樣為錯誤使用它。 重用@ micro.pavo所說的

final RelativeLayout rLayout = (RelativeLayout) scrollView.getChildAt(0);
final TextView textView = (TextView) rLayout.getChildAt(0);

或者您可以直接訪問

final TextView textView = (TextView)findViewById(R.id.txtChapter1Title);

最后的TextView textView =(TextView)scrollView.getChildAt(0); //在此行崩潰

RelativeLayoutScrollView的子級,您正在將其強制轉換為TextView

所以,

java.lang.ClassCastException:android.widget.RelativeLayout無法轉換為android.widget.TextView

您正在收到ClassCastException因為您試圖在此行上將RelativeLayout轉換為TextView

final TextView textView = (TextView) scrollView.getChildAt(0);

xml代碼所示, ScrollView下的第一個子級是RelativeLayout ,請嘗試使其如下所示:

final RelativeLayout rLayout = (RelativeLayout) scrollView.getChildAt(0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM