浅谈一下关于android碎片化的问题

                android操作系统是当前国内最流行的三个移动 操作系统之一。然后作为android开发者,我们有的时候会被这个谷歌的开源操作系统的碎片化问题弄很头大。

         什么android操作系统的碎片化问题呢?百度百科上说,碎片化就是关于整个android平台的差异越来越大。其实现在看来,iOS开发的人似乎很幸福。苹果公司把整个生态圈子都牢牢控制,所以苹果的碎片化问题真的不严重。

         android系统的碎片化问题在什么地方体现的呢?

         1.设备品牌的碎片化

          2013年:支持Android的机型为11868种
         2014年:支持Android的机型为18796种,其中,三星设备的占比为43%。简而言之,支持Android的机型越来越多(形态、尺寸、性能规格各异),而Android的不同版本又加剧了分化,Android的碎片化程度越来越高。对于开发者来说app的开发更加困难了。相比苹果而言,那就简直是,没有什么碎片化的问题可言。最多说iPhone6 plus比iphone5s等之前的产品的屏幕,分辨率等都不同。
         2.操作系统碎片化:

         android系统的更新版本还是很快(相对比苹果而言),

       
        
           这张图是2014年的报告,2014年,andorid 4.4的普及程度还没有过30%(现在4.4的系统好像超过一半的使用量),android系统的用户一般集中在2.0和4.0的系统的用户是最多的。然而,这些问题依然会带来一些问题,比如日历组件,android 2.0 的系统并不支持。再比如android 2.3 系统的 网络部分的httpconnection存在问题,只能用Httpclient开发网络。

            3.屏幕碎片化:

             我们都知道,在android系统的前端组件中,经常以dp这个单位来代表px,很多书上都说这个可以解决碎片化问题。其实不然,dp这个单位确实解决碎片哈问题,但是这是在显示分辨率(dpi)相差不大的情况下实现的。现在,android设备的屏幕分辨率简直是参差不一。比如,50dp在160dpi上确实只有50px,但是要是在现在的高分辨率的手机上,可能有150dp。如果我们用这种方式去衡量界面组件的宽高,距离等,势必会出现问题。

          以上就是android碎片化的表现(或者叫做原因)

           接下来说下我们怎么尽量避免这些问题(一下都是我平时在项目中碰到的问题)

            1.XML父节点多使用relativelayout(做好大致组件的大致布局)

            线性布局使我们在android使用的最多的布局。但是,线性布局的某些属性在碎片化严重的情况下,适配问题会很糟糕:比如layout_marginRight,layout_marginLeft这些属性,在我们的开发中,通过调试,适配了我们自己的设备,但是,在其它设备中,可能这样的属性显得不合适。比如,要体现相对关系,我们需要先把每个组件的哪些在哪些位置放好了,然后再用线性布局,来划分同一些细小的距离,比如:同父布局的边距的距离,需要在中间偏右一点的位置。这时候,我们就可以使用线性布局来调整差异。

            2.实在需要限定死宽度,高度和距离的组件请参照谷歌官方的android design 文档。

            这份文档的链接是http://mirrors.segmentfault.com/adchs/style/metrics-grids.html

             比如,我们编写一个登录的button的高度,一般是48dp,每个activity的标题一般是48dp,界面元素之间的留白是8dp(比如每个项目显示的字体需要居中,与上下的宽度是8dp最好),等等

           3.横向图片和文字都不要并列:

            这种情况开发的时候已经碰到过很多次了。

            比如大家看下面这张设计稿:

            

          

           这张设计稿每个item是一个信息,我们编写的时候,一般喜欢使用横向的线性布局。问题就来了:每个活动的地点我们是不确定的。中间那段字体很向宽度不确定。先尝试使得中间那块(表示地点)的TextView组件的设置显示不完全(elipisize属性)。问题马上就来了:每行显示字又数很多怎么办?好吧,我们限制中间那个布局的宽度。好吧,限定中间那个表示地点的布局宽度是多少呢?随便吗?设置为80dp?出现的问题是:在LG G3 手机上,可以显示全部(连同最右边的价格和数目那个布局)。这样很好,然后在4.0英寸的HTC手机上,80dp占了很大的横巷宽度,最右边的价格栏和数目居然挤得一半在显示范围内,一般不在。

           类似上面的问题,两个项目都碰到过了。此类问题确实不好解决。我之后向设计师建议,如果图片和不确定的数目大小的文字,请隔行处理。不要占在一行。处理起来实在因为碎片化的问题很头大。

          4.关于比较合理的Textivew显示:

           Textview虽然有ellipsize这样的属性,但是这个属性并不是那么合理。就像上面说的一样,就算设置了lines和maxlines等属性,显示仍然有碎片化问题。这里提出一种解决方案:让设计师把不确定的字数目的TextView占横向的全部,然后我们在设置TextView只显示部分。

           之后我们在java代码中动态显示:

           代码如下:

          布局XML:

          

 <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
            <LinearLayout
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
                     <TextView
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:layout_marginRight="10dp"
                         android:layout_marginTop="8dp"
                         android:layout_marginLeft="10dp"
                         android:maxLines="3"
                         android:id="@+id/txt_regulatoractivity_longtext"
                         android:singleLine="false"
                         android:ellipsize="end"
                         android:textColor="#ffffff"
                         android:textSize="18sp"
                         android:text="@string/long_text"
                         />
                       <RelativeLayout
                           android:layout_marginTop="8dp"
                           android:layout_width="match_parent"
                           android:layout_height="wrap_content">
                              <TextView
                                  android:textColor="#000000"
                                  android:text="更多显示"
                                  android:layout_marginRight="8dp"
                                  android:id="@+id/txt_regulatoractivity_showmore"
                                  android:layout_width="wrap_content"
                                  android:layout_height="wrap_content"
                                  android:layout_alignParentRight="true"
                                  />
                        </RelativeLayout>
            </LinearLayout>
     </ScrollView>
       这里将要显示的Textivew占完横向宽度,然后设置这个组件只有部分显示。下面用一个“提示显示更多”来响应操作。

      接下来是java代码:

      

public class RegulatorActivity extends ActionBarActivity {

      private TextView txtRegulatorActivityLongText;
      private TextView txxtRegulatorActivityShowMore;
      private static boolean SHOWMORE=false;
      private static int MAXLINES=6;

    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
//            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            this.setContentView(R.layout.regulator_layout);
            this.initial();
            SHOWMORE=false;
    }

    private void initial()
    {
       this.bindID();
       this.setCLickListener();
    }
    private void bindID()
    {
        this.txtRegulatorActivityLongText=(TextView)this.findViewById(R.id.txt_regulatoractivity_longtext);
        this.txxtRegulatorActivityShowMore=(TextView)this.findViewById(R.id.txt_regulatoractivity_showmore);
    }
    private void setCLickListener()
    {
          this.txxtRegulatorActivityShowMore.setOnClickListener(new View.OnClickListener() {
               public void onClick(View view) {
                      if(!SHOWMORE)
                      {
                          SHOWMORE=true;
                          txtRegulatorActivityLongText.setMaxLines(Integer.MAX_VALUE);
                          txtRegulatorActivityLongText.requestLayout();
                          txxtRegulatorActivityShowMore.setText("收起");

                      }else{
                         SHOWMORE=false;
                         txtRegulatorActivityLongText.setMaxLines(MAXLINES);
                         txtRegulatorActivityLongText.requestLayout();
                         txxtRegulatorActivityShowMore.setText("显示更多");
                      }
              }
          });
    }

}
         我想,这种方法,应该是解决TextView不完全显示最好的办法了吧。

         

         关于android碎片化的问题,还有很多很多,比如操作系统问题。现在工作室开发的项目的对mainfast.xml文件中的最低sdk的支持在4.0,也就是最低适配4.0系统。因为目前大部分手机都是4.0以上的系统了。

          希望谷歌官方对android的碎片化问题可以采取更好的措施

         

           

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页