在屏幕上保存实例以双布局活动旋转

时间:2015-05-22 10:52:41

标签: android android-layout

我的活动有一个ImageView。它从拍照行动中获取图像。此活动有两种布局。 Two layouts

在清单中,有:

The manifest

我的问题是,如果我删除

create or replace trigger "INKOOPORDER_T1"
AFTER insert or update or delete on INKOOPORDER
for each row 
begin

INSERT INTO INKOOPORDERREGEL
    (I_nummer)
SELECT
    I_nummer
    FROM inkooporderregel;

end;

数据不会保存,但如果没有,则form_layout.xml(land)不会加载。 screenRotate上的加载是默认的横向布局。

如何解决我的问题,即在使用保存的数据轮换后加载新的xml布局?

更新

我不想保留

configChanges="orientation|keyboardHidden|screenSize"

3 个答案:

答案 0 :(得分:2)

如果您想保留configChanges="orientation|keyboardHidden|screenSize",则需要再次手动拨打setContentView

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    //Get last state
    String text = et1.getText().toString();

    //Create new view according to layout
    setContentView(R.layout.activity_login);

    // Restore last state
    et1 = (EditText) findViewById(R.id.et1);
    et1.setText(text);
}

否则,最好的办法是将数据保存到捆绑onSaveInstanceState并在onCreate

中恢复

请参阅此处http://developer.android.com/training/basics/activity-lifecycle/recreating.html

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        // Save the user's current game state
        savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
        savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

        // Always call the superclass so it can save the view hierarchy state
        super.onSaveInstanceState(savedInstanceState);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); // Always call the superclass first

        // Check whether we're recreating a previously destroyed instance
        if (savedInstanceState != null) {
            // Restore value of members from saved state
            mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
            mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
        } else {
            // Probably initialize members with default values for a new instance
        }
        ...
    }

答案 1 :(得分:1)

问题解决了!

让我解释一下。当你添加

android:configChanges="orientation|keyboardHidden|screenSize"

您声明,任何更改都将手动完成,因此最好从此解决方案中退出另一个更改,我将在下面介绍。

我的问题是保持更复杂 - 然后是文本 - 内容从一个布局到另一个布局。关键是,方向或屏幕尺寸的变化会导致活动破坏。再次创建destroy活动后,调用onCreate方法并再次运行活动生命周期。

如果数据无法从数据库中恢复,那么将每个数据放入一个包中是一种很好的做法。

让mi告诉你我的代码:

    @Override
    public void onSaveInstanceState(Bundle outState){
        Log.d("debug", "onSaveInstanceState");
        super.onSaveInstanceState(outState);
        if(pictureAdded){
            outState.putBoolean(ADDED, true);
            outState.putString(PATH, currentPhotoPath);
        }else{
            outState.putBoolean(ADDED, false);
        }
    }

pictureAdded是我的标志,如果用户已拍照,则为真,因此图片存储在内存中,并且存在文件路径。

在destroy之前调用此方法。在创建时,我们想要检查它是否是第一次创建活动,或者至少是否曾在之前拍摄过照片。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.form_layout);
    pictureAdded = false;
    if (savedInstanceState == null){
        return;
    }
    if (savedInstanceState.containsKey(ADDED)){
        if (savedInstanceState.getBoolean(ADDED)){
            try{
                currentPhotoPath = savedInstanceState.getString(PATH);
                photoPreview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        photoPreview.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                        setPic();
                    }
                });
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

onCreate()方法的第一部分通常是。然后你必须检查是否存在捆绑。然后,当且仅当密钥存在时,才能使用存储在密钥中的数据。

当我们希望将图片添加到ImageView时,事情变得越来越困难。为什么?因为此时,imageView的尺寸为0px x 0px。怎么解决?解决方案发布在上面。使用treeobserver模式。这部分代码为您提供了

中的代码
@Override
public void onGlobalLayout(){
    //here
}

将在创建布局后立即调用,因此它的部件具有尺寸。如果您希望执行一次代码,请删除onGlobalLayoutListener。

希望,能帮助别人。

答案 2 :(得分:0)

检查这一点,可能会有所帮助 Save data and change orientation