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

在开发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)); }

android控件根据屏幕大小自适应 - 雨下晴川 - 小熊梦工厂
 
自定义的方式

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我觉得是繁琐的,而且是易错不易维护的)。我在想,既然都是做同样一种工作,能不能抽象出来,统一处理呢?我们能不能让每个页面都调用一个统一的方法来重新生成界面?当然可以了。这就是要对架构进行优化、这就是设计模式啊!!!那怎么样才能做到呢?我们又要用到反射了

  1.   super.onCreate(savedInstanceState); 

  2.             setContentView(R.layout.main); 
  3.             LinearLayout ll = (LinearLayout)findViewById(R.id.LinearLayout01); 
  4.             for (int i = 0; i < ll.getChildCount(); i++) { 
  5.                 ((TextView) ll.getChildAt(i)).setText("Text View " +i); 
  6.             }

根据控件名获得控件的id

 int id = R.id.class.getField("s" + i).getInt(0); 


这里提供一种方法来获得所有的控件,当然控件的类型我们可用想想能不能也通过反射来获得,这样我们就可用完全依据layout文件来区别,用一个抽象的方法来隔离所有差异了。【我还在研究,研究完成之后贴上】
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值