您的位置:首页 > 移动开发 > Android开发

android控件根据屏幕大小自适应

2014-07-01 20:12 633 查看
在开发android项目的时候,我们常常会考虑这样的问题:为不同的手机屏幕显示出最佳的界面,以提升用户的体验。不例外的我这次的项目开发也要考虑这个问题,由于之前都没有做过相关的开发,所以首先就是到网上寻找资料,无果。网上找的都是让手机根据不同的屏幕来选择不同的layout文件来达到不同的显示效果,但是无疑的,这给软件安装包和开发人员增加了负担,最后我想到了能不能让activity去检测屏幕的大小,然后再设置它内部的控件呢(当然这些控件和布局是来自于同一个Layout文件)?事实证明了我这种想法的可行性,下面就贴出这部分代码,以供参考:

读取XML布局文件的方式
public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
       Button bt;
       Button bt2;
       Button bt3;  Button bt4;
       bt=(Button)findViewById(R.id.button1);
       bt2=(Button)findViewById(R.id.button2);
       bt3=(Button)findViewById(R.id.button3);
       bt4=(Button)findViewById(R.id.button4);
       Display display = this.getWindowManager().getDefaultDisplay();
       int width = display.getWidth();
         int height=display.getHeight();
        bt.setHeight((int) ((height)*0.2));
        bt2.setHeight((int) ((height)*0.3));
       bt3.setHeight((int) ((height)*0.3));
       bt4.setHeight((int) ((height)*0.2));
      
      }

自定义的方式
private void setByMe()
    {
     Display display = this.getWindowManager().getDefaultDisplay();
     int width = display.getWidth();
     int height=display.getHeight();
     //TableLayout tab = new TableLayout(this);
     LinearLayout tab=new LinearLayout(this);
     tab.setOrientation(LinearLayout.VERTICAL);
     for(int i =0;i<12;i++){
      //TableRow tr = new TableRow(this);
      TextView tv = new TextView(this);
      tv.setText("ssss"+i);
      tv.setWidth((int) ((width)*0.3));
      tv.setHeight((int) ((height)*0.1));
      EditText et = new EditText(this);
      et.setWidth((int) ((width)*0.7));
      et.setHeight((int) ((height)*0.1));
   //   tr.addView(tv);
   //   tr.addView(et);
      et.setText(i+"");
      tab.addView(et);
     }
     setContentView(tab);
    }


当然,如果想完全控制控件的位置,可用使用绝对布局absolutelyLayout;

在代码中设置控件位置的代码如下(这个是网上找的+)

得到屏幕窗口大小
// get the window resolution 
private static DisplayMetrics dm;
private static int m_dispWidth;
private static int m_dispHeight;dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
m_dispWidth = dm.widthPixels;
m_dispHeight = dm.heightPixels;
调整控件位置和大小:
private EditText et_longitude;
AbsoluteLayout.LayoutParams lp;lp = new AbsoluteLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0, 0);lp.x = x;
lp.y = y;
lp.height = m_etHeight;
lp.width = m_etWidth;
et_longitude.setLayoutParams(lp);设置控件显示字体大小:(list 不可用这种方法)
et_longitude.setTextSize(TEXT_SIZE);


当然,上面所说的只是一个简单的例子,在实际项目过程中,我们还会担心这样的问题,我们得为每一个界面设置一个界面重新计算的方法,来给每个界面重新匹配屏幕,这样依然是相当的耗时耗力的(不断的findviewbyId我觉得是繁琐的,而且是易错不易维护的)。我在想,既然都是做同样一种工作,能不能抽象出来,统一处理呢?我们能不能让每个页面都调用一个统一的方法来重新生成界面?当然可以了。这就是要对架构进行优化、这就是设计模式啊!!!那怎么样才能做到呢?我们又要用到反射了

super.onCreate(savedInstanceState); 

            setContentView(R.layout.main); 

            LinearLayout ll = (LinearLayout)findViewById(R.id.LinearLayout01); 

            for (int i = 0; i < ll.getChildCount(); i++) { 

                ((TextView) ll.getChildAt(i)).setText("Text View " +i); 

            }


根据控件名获得控件的id
 int id = R.id.class.getField("s" + i).getInt(0);


这里提供一种方法来获得所有的控件,当然控件的类型我们可用想想能不能也通过反射来获得,这样我们就可用完全依据layout文件来区别,用一个抽象的方法来隔离所有差异了。【我还在研究,研究完成之后贴上】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: