我有一个活动,其布局我需要在旋转后更改,部分布局是使用将放置的视图的宽度和高度绘制的图形。我的代码第一次运行时,图形被正确绘制,但是在旋转后容器视图的宽度和高度不正确,实际上它们看起来像是没有旋转的视图。
这是我到目前为止所拥有的,
android:configChanges="keyboardHidden|orientation|screenSize"
的onCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle extras = getIntent().getExtras();
patient_id = extras.getInt("patient_id");
patient_name = extras.getString("patient_name");
historyDurationType = 12;
constructLayout();
}
constructLayout
public void constructLayout(){
if(landScape){
setContentView(R.layout.activity_bg_history_static_land);
//Set buttons
btnTwelve = (Button)findViewById(R.id.btnTwelveHoursLand);
btnTwentyFour = (Button)findViewById(R.id.btnTwentyFourHoursLand);
btnSeven= (Button)findViewById(R.id.btnSevenDaysLand);
btnTwelve.setOnClickListener(this);
btnTwentyFour.setOnClickListener(this);
btnSeven.setOnClickListener(this);
btnTwelve.setBackgroundColor(getResources().getColor(R.color.light_blue_regular));
btnTwentyFour.setBackgroundResource(android.R.drawable.btn_default);
btnSeven.setBackgroundResource(android.R.drawable.btn_default);
}else{
setContentView(R.layout.activity_bg_history_static);
//Set buttons
btnTwelve = (Button)findViewById(R.id.btnTwelveHours);
btnTwentyFour = (Button)findViewById(R.id.btnTwentyFourHours);
btnSeven= (Button)findViewById(R.id.btnSevenDays);
btnTwelve.setOnClickListener(this);
btnTwentyFour.setOnClickListener(this);
btnSeven.setOnClickListener(this);
btnTwelve.setBackgroundColor(getResources().getColor(R.color.light_blue_regular));
btnTwentyFour.setBackgroundResource(android.R.drawable.btn_default);
btnSeven.setBackgroundResource(android.R.drawable.btn_default);
btnComment = (Button)findViewById(R.id.btnCommentGraph);
btnComment.setOnClickListener(this);
populateOtherContent(officialReadings12);
TextView tvStats = (TextView)findViewById(R.id.txtStatistics);
Typeface chunkFiveFont = Typeface.createFromAsset(getAssets(), "fonts/chunkfivettfversion.ttf");
tvStats.setTypeface(chunkFiveFont);
TextView tvReading = (TextView)findViewById(R.id.txtReadingTitle);
tvReading.setTypeface(chunkFiveFont);
comment = null;
}
if(needData){
getLatestReadings();
}
populateGraph();
}
populateGraph
public void populateGraph(){
if(landScape){
graph_container = (LinearLayout)findViewById(R.id.graph_land_content_layout);
}else{
graph_container = (LinearLayout)findViewById(R.id.graph_content_layout);
}
//Create graphlayout
mainGraph_Layout = new RelativeLayout(this);
RelativeLayout.LayoutParams glParams = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
mainGraph_Layout.setId(909);
mainGraph_Layout.setLayoutParams(glParams);
graph_container.addView(mainGraph_Layout);
graph_container.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if(needsGraph){
layoutGraph();
needsGraph = false;
}
}
});
}
layoutGraph
public void layoutGraph(){
viewWidth = mainGraph_Layout.getWidth();
viewHeight = mainGraph_Layout.getHeight();
//MORE STUFF IS HERE BUT NOT IMPORTANT
}
onConfigurationChanged
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
ActionBar actionBar = getActionBar();
if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
//Config is landscape here
actionBar.hide();
needData = false;
landScape = true;
needsGraph = true;
constructLayout();
}else{
//Config is portrait here
actionBar.show();
needData = false;
landScape = false;
needsGraph = true;
constructLayout();
}
}
旋转后,它出现在我遇到问题的layoutGraph()viewWidth和viewHeight对象中。我曾经假设(使用全局布局监听器)值是正确的。我的理解是,只有在“graph_container”完成(以及横向或纵向)时才会触发侦听器,因此在调用layoutGraph()时,“mainGraph_layout”的宽度和高度(一个graph_container,宽度和高度设置为MATCH_PARENT) )会很高兴。看来,我得到的宽度和高度就好像手机仍然是人像一样,值得注意的是,似乎还考虑了删除操作栏。
很抱歉这个问题很长,但我认为最好显示所有代码。如果需要显示任何其他内容,请告诉我。
提前致谢, 约什
答案 0 :(得分:1)
有一种更好的方法可以做到这一点。
使用资源文件夹
将您的默认布局文件放在res/layout
中,将res/layout-land
中的格局设置为格局。换句话说,将res/layout/activity_bg_history_static_land.xml
移至res/layout-land/activity_bg_history_static.xml
。
在onCreate
,请致电
setContentView(R.layout.activity_bg_history_static);
当您处于横向时,系统将从res/layout-land
选择文件,否则为res/layout
。
如果您的视图仅存在于一个布局中而不存在于另一个布局中,例如注释按钮,将代码包装在null检查中,如下所示:
btnComment = (Button) findViewById(R.id.btnCommentGraph);
if (btnComment != null) {
btnComment.setOnClickListener(this);
}
对于populateGraph()
,请确保res/layout/activity_bg_history_static.xml
和res/layout-land/activity_bg_history_static.xml
都有android:id="@+id/R.id.graph_content
。然后,您可以执行findViewById(R.id.graph_content)
并获得所需的LinearLayout
。
跨越轮播保存数据
在您的活动中,覆盖onSaveInstanceState()
,并将getLatestReadings()
中的数据保存到捆绑包中。
然后,在onCreate
:
if (savedInstanceState == null) {
getLatestReadings();
} else {
// Restore latest readings from savedInstanceState
}
这样,您可以让系统处理轮换,即从清单中删除它:
android:configChanges="keyboardHidden|orientation|screenSize"
由于系统正在处理旋转,因此您不再需要拥有视图树观察器。而且您不必覆盖onConfigurationChanged
。