我需要一个子布局(可以是任何布局,如FrameLayout
或RelativeLayout
)来忽略方向更改并始终保持横向方向。但不是它的父母或任何其他兄弟布局/视图,他们应该相应地改变他们的方向。
因此,我无法使用setRequestedOrientation()
或android:screenOrientation="landscape"
。或者它将锁定整个屏幕或活动的方向。我只需要锁定这个单一的布局。
我的布局XML:
RelativeLayout (Parent)
TextView
FrameLayout/RelativeLayout <-- this need to be locked
FrameLayout
Button
答案 0 :(得分:1)
扩展要保持纵向的布局类,并覆盖dispatchConfiurationChanged(Configuration)方法,如下所示。
public void dispatchConfigurationChanged(Configuration newConfig) {
Configuration c = new Configuration(newConfig); // copy
c.orientation = ORIENTATION_PORTRAIT; // lock to portrait
super.dispatchConfigurationChanged(c);
}
确保您的应用程序配置为不在方向更改时重新启动。
答案 1 :(得分: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);
}});
}
}
然后,你可以很好地执行你想要的任何事情。如果您可以更具体地了解要在子区域上执行的行为,我可能会建议更具体的代码。
您可能想要做的一件事就是保持