当我启动应用程序时,该按钮有效。每次旋转手机时,都会调用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>
答案 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
只是重新创建自己。祝你好运。