方向更改不会完全重绘布局

时间:2011-09-08 06:59:30

标签: android seekbar

这是我之前提问的主要编辑

我正在创建一个名为OneLineSeeker的自定义(复合)组件,它由TextView和SeekBar组成。 当我在布局中声明了多个OneLineSeekers时,它们不会在配置更改时保留其状态。所有导引头拇指在配置更改时采用相同的位置(最后一个OneLineSeeker的位置)。 如果我不使用自定义组件并且单独使用SeekBars(在主活动中取消注释//a()),他们将在配置更改时保留各自的位置。 有人可以帮忙吗?

src 文件

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 文件

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 个答案:

答案 0 :(得分:1)

它不应该将其位置重置为零。这实际上是一个功能。当视图与id关联时,它通常会保存并在配置更改时恢复其状态。

如果您不希望特定视图在配置更改时保存状态,则可以从布局中的视图条目中删除android:id(但您将无法控制该视图)。另一种方法是扩展ProgressBar并禁用其恢复状态的能力。

最后一个选项是最简单的选项:覆盖onRestoreInstanceState()并在那里重置状态:

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

但我强烈建议不要重置视图状态。毕竟,在配置更改上恢复状态的整个想法是让用户认为好像什么都没有真正改变。并且您需要有非常强大的理由来禁用此行为。

答案 1 :(得分:0)

因为你必须定义方向改变方法.....

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

尝试此代码可能会得到任何帮助.....