首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >建立方向..。不同的人像和景观设计模式。而不重置输入的值

建立方向..。不同的人像和景观设计模式。而不重置输入的值
EN

Stack Overflow用户
提问于 2014-09-24 11:32:47
回答 1查看 918关注 0票数 0

我有不同的布局设计的肖像模式和不同的外观布局的景观模式。在“res”文件夹中,我创建了一个名为“”的新文件夹,在该文件夹中,我创建了与内部“布局”同名的文件。

我有textview (计数器),当方向改变时,它会恢复值。但我所面临的问题是,当方向从人像转向景观时,设计仍然保持原样。我想知道,我该怎么处理?我会很感激的。谢谢。

MainActivity.java:

代码语言:javascript
复制
public class MainActivity extends Activity {

private int sum = 0;
Button add, sub;
TextView tv1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv1 = (TextView) findViewById(R.id.textView1);

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

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            sum++;
            tv1.setText("Incrementation = " + sum);
        }
    });
    sub = (Button) findViewById(R.id.button2);
    sub.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            sum--;
            tv1.setText("Decrementation = " + sum);
        }
    });
}  
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);

if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// setContentView(R.layout.activity_main);
Log.v("message", "ORIENTATION_LANDSCAPE");

} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
Log.v("message", "ORIENTATION_PORTRAIT");
}

}


@Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);
    outState.putInt("sum", sum);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onRestoreInstanceState(savedInstanceState);
    int x = savedInstanceState.getInt("sum");
}

}

res\layout-land\activemain.xml(用于景观模式)

代码语言:javascript
复制
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:background="@drawable/backg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="total is = 0"
    android:layout_gravity="center"
    android:textSize="40sp"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>

<Button
    android:id="@+id/button1"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_weight="1"
    android:text="ADD" />

<Button
    android:id="@+id/button2"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:layout_gravity="center"
    android:text="Sub" />
</LinearLayout>

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Large Text"
    android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

Res\layout\activity_main.xml(用于纵向模式):

代码语言:javascript
复制
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:background="@drawable/backg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:freezesText="true"
    android:text="total is = 0"
    android:textSize="40sp"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<Button
    android:id="@+id/button1"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="ADD" />

<Button
    android:id="@+id/button2"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="Sub" />

</LinearLayout>

在清单中,我添加了: android:configChanges="orientation|screenSize“(如何使用onConfigurationChanged()处理布局?)

代码语言:javascript
复制
<activity
        android:name="com.example.apptest.MainActivity"
        android:configChanges="orientation|screenSize"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="com.example.apptest.MAINACTIVITY" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-24 11:48:58

当你写这个

代码语言:javascript
复制
android:configChanges="orientation|screenSize"

在清单中:这意味着你将处理方向改变你自己。因此,编写类似的内容来处理配置更改。

代码语言:javascript
复制
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.activity_main);
    ...
}

注意,这样做:您将从xml中膨胀新的布局。因此,将创建新的View,并丢失以前视图的内容。

为了获得更好的用户体验,您需要从新视图中的旧视图中传输内容:

就像这样:

代码语言:javascript
复制
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    CharSequence tmp = ((TextView)findViewById(R.myId)).getText();
    setContentView(R.layout.activity_main);
    ((TextView)findViewById(R.myId)).setText(tmp);
    ...
}

但是 Android提供了一个有用的钩子来更好地编写所有这些。

从清单中移除这一行

代码语言:javascript
复制
android:configChanges="orientation|screenSize"

和使用:

代码语言:javascript
复制
@Override
protected void onSaveInstanceState(Bundle outState) {
    //here store your data in outState
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(savedInstanceState!=null){
       //at this point savedInstanceState contains everything that was stored in outState.
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26015845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档