2013-07-15 48 views
0

我是一個非常新的Android開發人員,所以我有一個非常基本的問題。針對不同屏幕方向的不同窗口小部件(視圖)?

基本上,我有兩個屏幕布局,一個用於縱向,另一個用於橫向。我使用res/layout和res/layout-land文件夾。兩個方向都很好,但我爲每個方向有不同的控件(按鈕),btnPortrait和btnLandscape。

當我嘗試調用SetClickListener()時出現問題。因爲當設備以縱向定向時,框架無法定位btnLandscape,反之亦然,我使用onConfigurationChange()手動處理方向更改。它似乎也沒有工作。

我的代碼:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    btnPortrait = (Button) findViewById(R.id.portraitButton); 
    tvPortrait = (TextView) findViewById(R.id.portraitText); 
    btnLandscape = (Button) findViewById(R.id.landscapeButton); 
    tvLandscape = (TextView) findViewById(R.id.landscapeText); 
} 

而且onConfigurationChange():

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

    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
     btnPortrait.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
        Toast.makeText(getContext(), "Portrait",Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

    else { 
     btnLandscape.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Toast.makeText(getContext(), "Landscape", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 

祝酒詞工作無。 有人知道會發生什麼嗎?

在此先感謝。

+0

爲什麼你必須爲每個不同的按鈕?只要給他們同樣的ID和活動將看看他們相應 –

+0

他們並不旨在相同的功能,換句話說,它們是兩個完全不同的按鈕。我使用Toast簡化了代碼,不會輸入與我的問題無關的商業模式。 – AirieFenix

回答

1

不要將它們命名爲不同的名稱;相同功能的小部件應共享相同的ID,無論它是縱向還是橫向。

如果它是一個在景觀中只存在或功能不同的小部件,只需在findViewById()後檢查它是否爲空,並且如果返回null,那麼您知道您不在包含該按鈕的佈局的配置中。

+0

你是對的,無論我嘗試初始化按鈕,它都會返回null。您是否想過一種方法來分配橫向佈局中的小部件,但不是縱向佈局中的小部件?謝謝。 – AirieFenix

+0

正如我所說的,只是嘗試解決按鈕。如果它不爲空,那麼你知道你處於橫向佈局。 – kcoppock

0

只要確保你的佈局,土地按鈕的ID是相同的ID在默認佈局

UPDATE1:

使用插件這樣

if(btnPortrait !=null) { 
// do what you want 
} 
+0

正如我在評論中所說的,他們不是同一個按鈕。一個它應該以縱向模式出現,另一個則以橫向模式出現。 – AirieFenix

+0

顯示update1 –

0

我確定之前添加不爲null檢查不敢肯定的,你通過‘他們是不一樣的按鈕,’但這樣做你想要的兩個不同的資源ID將是如下的一種方式的意見是什麼意思?

public class MyActivity extends Activity { 

    Button myButton = null; 
    TextView myTextView = null; 

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

     myButton = (Button) findViewById(R.id.portraitButton); 
     if (myButton == null) 
      myButton = (Button) findViewById(R.id.landscapeButton); 
     myTextView = (TextView) findViewById(R.id.portraitText); 
     if (myTextView == null) 
      myTextView = (TextView) findViewById(R.id.landscapeText); 
    } 

    // The following method is your OnClickListener 
    public void sayHello(View v) { 
     switch (v.getId) { 
      case R.id.portraitButton : 
       // Do something for portrait 
       break; 
      case R.id.landscapeButton : 
       // Do something for landscape 
       break; 
     } 
    } 
} 

在你的佈局文件,那麼你會使用OnClickListener 如下分配...

對於肖像...

<Button 
    android:id="@+id/portraitButton" 
    ... 
    android:onClick="sayHello" > 
</Button> 

對於景觀...

<Button 
    android:id="@+id/landscapeButton" 
    ... 
    android:onClick="sayHello" > 
</Button> 

在這樣,當調用setContentView(...)時,OnClickListener由膨脹過程設置。然後簡單地歸結爲確定資源ID以決定需要採取的行動。