2013-02-14 2 views
4

Мне нужен детальный макет (может быть любой макет, например FrameLayout или RelativeLayout), чтобы игнорировать изменение ориентации и оставаться всегда в альбомной ориентации. Но не его родитель или другие макеты/взгляды братьев и сестер, они должны соответственно изменить свою ориентацию.Как предотвратить изменение ориентации только для макета, а не для всего экрана/активности

Следовательно, я не могу использовать setRequestedOrientation() или android:screenOrientation="landscape". Или он заблокирует ориентацию для всего экрана или активности. Мне нужно заблокировать только этот единственный макет.

Мой макет XML:

RelativeLayout (Parent) 
    TextView 
    FrameLayout/RelativeLayout <-- this need to be locked 
     FrameLayout 
     Button 
+0

Привет, я попробовал и то, и другое потребовалось. Спасибо за редактирование формата вопроса. – loser

ответ

1

Возможно, это зависит от того, что вы подразумеваете под «ориентацией на изменение». Тем не менее, я думаю, что лучшим местом для начала было бы создать свой собственный класс для той части, которая не должна меняться. Таким образом, расположение XML теперь есть два файла:

main_layout.xml

RelativeLayout (Parent) 
    TextView 
     MyNonChangingLayout 

my_non_changing_layout.xml

RelativeLayout 
    FrameLayout 
     Button 

Где вы создали

MyNonChangingLayout extends FrameLayout { 
    MyNonchangingLayout(Context content) { 
     super(context); 
     myContext = context; 
     makeFromXML(); 
    } 

private void makeFromXML() { 
    LayoutInflater inflater = (LayoutInflater)myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    topView = inflater.inflate(MyR.layout.my_non_changing_layout, this, false); 

    // Get all the sub Views here using topView.findViewById() 

    // Do any other initiation of the View you need here 

    // Make sure you this otherwise it won't actually appear! 
    super.addView(topView); 
} 

/* 
* Then, you can override quite a lot of the layout's calls and 
* enforce behaviour on the children. Two examples: 
*/ 

// To specifically catch orientation changes 
@Overridge 
onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    // You could create the layout here by removing all views and rebuilding them 
    // Perhaps by having a two xml layouts, one of which is "90 degrees out" ... 
    // If you do make the layot here, make sure you don't clash with the constructor code! 
    switch (newConfig.orientation) { 
     case ORIENTATION_LANDSCAPE: 
      // Make the layout for this orientation (as per above) 
      break; 
     case ORIENTATION_PORTRAIT: 
      // Make the layout for this orientation (as per above) 
      break; 
     case ORIENTATION_SQUARE: 
      // Make the layout for this orientation (as per above) 
      break; 
    } 
} 

//to handle size changes to enforce aspect ratios on children: 
@override 
protected void onSizeChanged (int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 

    int viewWidth = //something I've determine 
    int viewHeight = //something I've determined 
    setViewsize(viewToHaveSizedControlled, viewWidth, viewheight); 
} 

// The post thing means that it doesn't crash no matter which thread it is 
// executed on ... 
private void setViewsize(final View v, final int w, final int h) { 
    post(new Runnable() { 
     public void run() { 
      ViewGroup.LayoutParams lp = v.getLayoutParams(); 
      lp.width = w; 
      lp.height = h; 
      v.setLayoutParams(lp); 
    }}); 
} 

}

Вы может тогда nforce довольно хорошо все, что вы хотите. Если вы можете уточнить, какое поведение вы хотите применить в субрегионе, я могу предложить более конкретный код.

Одна вещь, которую вы, возможно, захотите сделать, это сохранить

+0

Спасибо за помощь. OnConfigurationChanged() является частью решения, которое я ищу. Теперь мне нужно пойти, чтобы изучить, как сделать необходимое для контента в представлении. На самом деле, мне нужно, чтобы кнопка отображалась точно в соответствии с кнопкой физического дома. В то время как остальная часть экрана изменит ориентацию при повороте устройства, кнопка появится на устройстве, как кнопка физического дома. Хе-хе ... это действительно странное требование. – loser

+0

Не могли бы вы решить это, имея две макеты верхнего уровня с кнопкой в ​​нужном месте - один для портрета и один для пейзажа? Макет верхнего уровня с помощью только кнопки (привязанной в нужном месте и с поворотом изображения по желанию) и относительной компоновкой для хранения всего остального? –

+0

Спасибо за советы, Нейл. Я делаю то, что предлагаю здесь. Который приводит меня к другим вопросам поворота макета. хе-хе. Во всяком случае, TQ для помощи. – loser

1

Расширение класса компоновки, которые вы хотите сохранить портретную ориентацию и переопределить метод dispatchConfiurationChanged (Configuration) следующим образом.

public void dispatchConfigurationChanged(Configuration newConfig) { 
    Configuration c = new Configuration(newConfig); // copy 
    c.orientation = ORIENTATION_PORTRAIT; // lock to portrait 
    super.dispatchConfigurationChanged(c); 
} 

Убедитесь, что ваше приложение настроено на перезагрузку при изменении ориентации.

+0

Спасибо за помощь. Великий ребенок FrameLayout (с кнопкой) выбирает ориентацию (через onConfigurationChanged), чтобы зафиксировать ее на портрете с приведенным выше примером. Но кнопка все еще отображается как пейзаж. Во всяком случае, я, вероятно, неправильно понял свою концепцию, вместо этого я попытаюсь повернуть кнопку. – loser

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