旋转后Android视图宽度和高度没有变化

时间:2014-04-12 15:47:49

标签: android android-layout rotation android-view

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

这是我到目前为止所拥有的,

  • 在我正在进行的活动的清单中:

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) )会很高兴。看来,我得到的宽度和高度就好像手机仍然是人像一样,值得注意的是,似乎还考虑了删除操作栏。

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

提前致谢, 约什

1 个答案:

答案 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.xmlres/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