Изменение ориентации не перерисовывает макет полностью - PullRequest
0 голосов
/ 08 сентября 2011

Это Major Edit на мой предыдущий вопрос

Я создаю пользовательский (составной) компонент с именем OneLineSeeker, который состоит из TextView и SeekBar.Когда в макете объявлено несколько OneLineSeekers, они не сохраняют свое состояние при изменении конфигурации.Все большие пальцы ищущего принимают одну и ту же позицию (позицию последнего OneLineSeeker) при изменении конфигурации.Если я не использую пользовательский компонент и использую только SeekBars отдельно (раскомментируйте //a() в основной деятельности), они сохранят свои индивидуальные позиции при изменении конфигурации.Может кто-нибудь помочь?

src files

A_seekbarsActivity.java

package com.an;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;

public class A_seekbarsActivity extends Activity {

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

        //a();
    }

    void a() {

        setContentView(R.layout.main_1);

        Button b = (Button) findViewById(R.id.button1);
        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                SeekBar sb = (SeekBar) findViewById(R.id.seekBar1);
                if(sb.getProgress() > 50) sb.setProgress(0);
                else sb.incrementProgressBy(5);

            }
        });
    }
}

OneLineSeeker.java

package com.an;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

public class OneLineSeeker extends LinearLayout {

    public OneLineSeeker(Context context, AttributeSet attrs) {
        super(context, attrs);

        View ols = LayoutInflater.from(context).inflate(R.layout.one_line_seeker, this, true);

        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.OneLineSeeker, 0, 0);

        String text = array.getString(R.styleable.OneLineSeeker_name);
        if (text != null) 
            ((TextView) ols.findViewById(R.id.name)).setText(text);

        array.recycle();

    }
}

res / layout files

main_1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <SeekBar android:id="@+id/seekBar1" android:layout_height="wrap_content" android:layout_width="match_parent"></SeekBar>
    <SeekBar android:id="@+id/seekBar2" android:layout_height="wrap_content" android:layout_width="match_parent"></SeekBar>
    <SeekBar android:id="@+id/seekBar3" android:layout_height="wrap_content" android:layout_width="match_parent"></SeekBar>
    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:oneLineSeeker="http://schemas.android.com/apk/res/com.an"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <com.an.OneLineSeeker 
     android:id="@+id/s1"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     oneLineSeeker:name="1"
     />

    <com.an.OneLineSeeker 
     android:id="@+id/s2"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     oneLineSeeker:name="2"
     />

    <com.an.OneLineSeeker 
     android:id="@+id/s3"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     oneLineSeeker:name='3'
     />     

</LinearLayout>

one_line_seeker.xml

<?xml version="1.0" encoding="utf-8"?>
<merge
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 >

    <TextView 
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id='@+id/name'
     android:text='name'
     />

    <SeekBar
     android:id='@+id/seekbar'
     android:layout_width="match_parent" 
     android:layout_height="match_parent"
     /> 

</merge>

res / values ​​ файлы

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="OneLineSeeker">
        <attr name="name" format="string"/>
    </declare-styleable>
</resources>

Ответы [ 2 ]

1 голос
/ 08 сентября 2011

Его нельзя сбрасывать в ноль. Это на самом деле особенность. Когда с представлением ассоциировано id, оно обычно сохраняет и восстанавливает свое состояние при изменениях конфигурации.

Если вы не хотите, чтобы конкретный вид сохранял состояние при изменении конфигурации, вы можете удалить android:id из записи представления в макете (но тогда вы не сможете управлять этим видом). Другой альтернативой является расширение ProgressBar и отключение возможности восстановления состояния.

Последний вариант самый простой: переопределить onRestoreInstanceState() и сбросить состояние там:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
    super.onRestoreInstanceState(savedInstanceState);
    bar.setProgress(0);
}

Но я бы настоятельно рекомендовал не сбрасывать состояние просмотра. В конце концов, вся идея восстановления состояния при изменении конфигурации состоит в том, чтобы заставить пользователя думать, как будто ничего действительно не изменилось. И у вас должны быть очень веские причины, чтобы отключить это поведение.

0 голосов
/ 08 сентября 2011

В этом вам нужно определить методы изменения ориентации .....

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    onCreate(null);
}

Попробуйте этот код, вы можете получить любую помощь .....

...