更改方向后按钮不起作用

时间:2014-04-26 06:00:05

标签: android

当我启动应用程序时,该按钮有效。每次旋转手机时,都会调用onConfigurationChanged。但是按下按钮后不再调用onClick。我该如何解决这个问题?提前谢谢。

PS:实际程序是一个带有很多按钮的计算器。

package com.thomas.test.app;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;


public class MainActivity extends Activity implements View.OnClickListener
{
    Button button1;

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

        if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE)
            setContentView(R.layout.activity_main_h);
        else if (newConfig.orientation==Configuration.ORIENTATION_PORTRAIT)
            setContentView(R.layout.activity_main_v);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_v);

        button1 = (Button)findViewById(R.id.button1);
        button1.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        Log.d("XYZ", "onClick: IN");
        if (view.getId()==R.id.button1)
            button1.setText("PRESSED");
    }
}

这是activity_main_h.xml(activity_main_v除了显示“vertical”之外是相同的):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.thomas.test.app.MainActivity">

    <TextView
        android:text="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button1"
        android:layout_below="@+id/textView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>

3 个答案:

答案 0 :(得分:5)

您已创建活动

 @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_v);

        button1 = (Button)findViewById(R.id.button1);
        button1.setOnClickListener(this);
    }

您的侦听器处于onCreate状态,因此只能单击

<强>的setContentView(R.layout.activity_main_v);

这种观点。做一件事

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
        setContentView(R.layout.activity_main_h);
        button1 = (Button)findViewById(R.id.button1);
        button1.setOnClickListener(this);
    }else if (newConfig.orientation==Configuration.ORIENTATION_PORTRAIT){
        setContentView(R.layout.activity_main_v);
        button1 = (Button)findViewById(R.id.button1);
        button1.setOnClickListener(this);
    }
}

所以你的事件可以在onConfigurationChanged上重新注册

答案 1 :(得分:1)

我认为在setContentView更改时orientation更改布局布局是一种很好的做法。无论如何,要暂时修复代码中的错误,请尝试使用

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

        if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE) {
            setContentView(R.layout.activity_main_h);
            button1 = (Button)findViewById(R.id.button1);
            button1.setOnClickListener(this);
         }
        else if (newConfig.orientation==Configuration.ORIENTATION_PORTRAIT) {
            setContentView(R.layout.activity_main_v);
            button1 = (Button)findViewById(R.id.button1);
            button1.setOnClickListener(this);
        }

}

答案 2 :(得分:0)

您是否在横向和纵向模式下使用完全不同的布局?如果没有,那么您只需从android:configChanges="orientation"

中的<Activity/>个对象中删除AndroidManifest.xml

...具有

android:configChanges="orientation"

告诉Android操作系统您要手动处理orientation更改。默认行为是Activity只是重新创建自己。祝你好运。