gpt4 book ai didi

Android View 旋转后宽高没有变化

转载 作者:太空狗 更新时间:2023-10-29 14:15:04 27 4
gpt4 key购买 nike

我有一个 Activity,我需要在旋转后更改其布局,部分布局是使用将放置在其中的 View 的宽度和高度绘制的图形。我的代码第一次运行时,图形绘制正确,但旋转后容器 View 的宽度和高度不正确,实际上它们看起来像是未旋转的 View 。

这是我目前的情况,

  • 在我正在进行的 Activity 的 list 中:

android:configChanges="keyboardHidden|orientation|screenSize"

  • 在我的 Activity 中,我有以下这些方法:

创建时

@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();
}

构造布局

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();
}

填充图

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;
}
}
});

}

布局图

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”的宽度和高度(子图形容器,宽度和高度设置为 MATCH_PARENT ) 会很好去。看起来我得到的宽度和高度好像手机仍然是纵向的,值得注意的是似乎也考虑到了操作栏的移除。

很抱歉问了这么长的问题,但我认为最好显示所有代码。如果需要显示任何其他内容,请告诉我。

提前致谢,乔希

最佳答案

有更好的方法来做到这一点。

使用资源文件夹

将默认布局文件放在 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 中选择文件。

如果您的 View 仅出现在一种布局中,而另一种布局中则不存在,例如评论按钮,将代码包装在空检查中,如下所示:

btnComment = (Button) findViewById(R.id.btnCommentGraph);
if (btnComment != null) {
btnComment.setOnClickListener(this);
}

对于 populateGraph(),确保 res/layout/activity_bg_history_static.xmlres/layout-land/activity_bg_history_static.xml 都有android:id="@+id/R.id.graph_content。然后你可以执行 findViewById(R.id.graph_content) 并获取 LinearLayout你需要的。

跨旋转保存数据

在您的 Activity 中,覆盖 onSaveInstanceState(),并将来自 getLatestReadings() 的数据保存到包中。

然后,在 onCreate 中:

if (savedInstanceState == null) {
getLatestReadings();
} else {
// Restore latest readings from savedInstanceState
}

有了它,您可以让系统处理旋转,即从您的 list 中删除它:

 android:configChanges="keyboardHidden|orientation|screenSize" 

由于系统正在处理旋转,因此您不再需要 View 树观察器。而且您不必重写 onConfigurationChanged

关于Android View 旋转后宽高没有变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23032605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com