2014-04-26 82 views
2

當我啓動應用程序時,按鈕有效。每次旋轉手機時,都會調用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是除了顯示「垂直」相同):

<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> 
+1

有一種更爲標準的方式可以將不同的佈局分配給不同的方向,而無需檢查方向本身:請參閱layout-land。如果你堅持使用這個實現,並且將CONFIG-CHANGES屬性設置爲你的活動,那麼它不會被重新創建,你的onCreate方法不會被調用,所以把初始化和監聽器賦值放到你的onResume中。 – rekaszeru

+0

是你的問題解決了嗎?親愛的,告訴你是怎麼做到的。我也有一個計算器,但一些按鈕不能在lansdscape模式下工作... 我的manisfest文件中沒有configchanges屬性。好心幫助 –

回答

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

+0

感謝您的明確解釋。 – yes4me

1

我不認爲在orientation變化改變由setContentView佈局佈局是一個很好的做法。不管怎麼說,暫時修復了你的代碼只是試試這個

@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); 
     } 

}

+0

哦,這工作!你如何以「良好」的方式處理方向? – yes4me

+0

正如@rekaszeru所說,如果您在'res/layout-land'和'res/layout-port'文件夾中放置兩個單獨的佈局文件,android會自動處理方向更改。你可能想引用這個問題http://stackoverflow.com/questions/12781449/different-design-for-landscape-and-portrait-orientation-android –

0

重新註冊您是否使用了橫向和縱向模式完全不同的佈局?如果沒有,那麼你可以簡單地刪除該<Activity/>對象android:configChanges="orientation"線在AndroidManifest.xml

有...

android:configChanges="orientation" 

告訴您要手動處理orientation變化的Android操作系統。默認行爲是Activity只是重新創建自己。祝你好運。

相關問題