2013-07-15 3 views
0

Я совершенно новый для Android, поэтому у меня есть очень простой вопрос.Различные виджеты (виды) для разных ориентаций экрана?

В принципе, у меня есть два макета экрана, один для портрета, а другой для пейзажной ориентации. Я использую папки res/layout и res/layout-land. Обе ориентации рисуются отлично, но у меня разные виджеты (кнопки) для каждой ориентации, btnPortrait и btnLandscape.

Проблема возникает, когда я пытаюсь вызвать onSetClickListener(). Поскольку, когда устройство ориентировано в портрете, фреймворк не может найти 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

Почему у вас есть разные кнопки для каждого? Просто дайте им тот же идентификатор, и активность будет выглядеть соответственно –

+0

Они не нацелены на ту же функцию, другими словами, это две совершенно разные кнопки. Я упростил код с Toast, чтобы не входить в бизнес-модель, которая не связана с моим вопросом. – AirieFenix

ответ

1

Не называйте их по-разному; виджеты для одной и той же функции должны иметь один и тот же идентификатор, будь то портрет или пейзаж.

Если это виджет, который существует или функционирует по-разному в ландшафте, просто проверьте, нет ли он null после findViewById(), и если это возвращает значение null, вы знаете, что вы не в конфигурации с макетом, который включает эту кнопку.

+0

Вы правы, он возвращает null независимо от того, где я пытаюсь инициализировать кнопку. Представляете ли вы способ назначения виджетов, которые находятся в макете ландшафта, но не в макете портрета? Благодарю. – AirieFenix

+0

Как я уже сказал, попробуйте разрешить кнопку. Если это не null, то вы знаете, что находитесь в ландшафтном макете. – kcoppock

0

Просто убедитесь, что ваша кнопка Id в макет-земля такая же Id в макете по умолчанию

Update1:

нормально добавить не пустой чек, прежде чем использовать виджет как этот

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

Как я уже сказал в своем комментарии, это не та же кнопка. Один из них должен появиться в портретном режиме, а другой - в пейзаже. – AirieFenix

+0

показать обновление1 –

0

I «Не уверен, что вы имеете в виду в комментариях« они не та же кнопка », но способ сделать то, что вы хотите с двумя разными идентификаторами ресурсов, будет следующим:

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> 

В таким образом, OnClickListener задается процессом инфляции, когда вызывается setContentView(...). Затем он просто сводится к определению идентификатора ресурса для определения того, какие действия необходимо предпринять.

Смежные вопросы