关于Android的开发经验总结
——第二届 Google 暑期大学生博客分享大赛 - 2011 Android 成长篇
最近一直在开发android上的应用程序,自己自学,想实现一个网上商城的客户端,经过不断地努力,经过不断地受挫,不断地提高,回过头自己可以去总结一些开发android的经验。写这篇的博客的目的是能够帮助其他想开发android的同道中人。
首先,如果想要学习开发android应用程序,入门级别的开发者,可以先去理解android本身提供的21种控件。这个过程中,自己要反复地去写程序,去按着自己的兴趣去开发一些小的程序。比如,可以去开发一个登陆界面,一个猜拳游戏,等等。另外,这个过程中,免不了应用到android的基础的五种布局方式。通过大量地编写demo去理解布局方式的意义。
概括地说,初步入门开发android要做的事情就是:熟练使用21控件+5种布局方式。
第二步,随着开发android的深入,随着对各种控件的熟练程度,对于UI的设计,你会越来越不满意android自带的控件,你会开始去开发自己定制的控件。例如一个按钮的点击效果,tabwidget的灵活使用等等。这个学习的过程,是充满困难与纠结的,因为网上的资料虽然多,但是大多数都是简单控件使用。其实,你能开始自己定制控件就走在了许多android的开发者之前了。所以自己尝试着定制控件,是一个充满困难,但是又充满乐趣的过程。一会儿我会讲解两种基本的定制。
第三步,突破了前个过程后,不要沾沾自喜,因为距离android的大牛还有很长的一段路要走。因为这个时候,你要开始理解android的内部机制,就必须了解linux内部原理。这个也得学习一段时间才能逐渐掌握。但是进入android的内核研究的话,你也就可以研究android上的安全问题,等等。因为笔者本人也就是在第二个阶段,所以对于以后的学习也不是很了解,所以也请大家见谅了。
接下来,我来介绍两种常用的定制方式,一个是按钮点击事件的处理,另外就是tabwidget的不同模式。
首先是按钮点击事件的处理。先看下面的两个图,发现“登陆”按钮在不点击的时候是红色的,但是在在点击的瞬间是黑色的,这是怎么做到的呢?
其实,我是用了在button上贴图的方式,一个图是红色的,另外一张图是黑色的来实现的效果。下面是xml代码:
<Button
android:id="@+id/login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/home_login_button_bk"
android:layout_gravity="right"
android:layout_marginTop="3px"
/>
其中“home_login_button_bk”是另外的一个xml文件,用这个文件来改变按钮的效果,这个文件在drawable文件夹下,代码:
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false"
android:drawable="@drawable/home_head_login_normal" />
<item android:state_focused="true" android:state_enabled="false"
android:state_pressed="true"
android:drawable="@drawable/home_head_login_normal" />
<item android:state_focused="true" android:state_enabled="false"
android:drawable="@drawable/home_head_login_normal" />
<item android:state_focused="true" android:state_pressed="true
android:drawable="@drawable/home_head_login_selected" />
<item android:state_focused="false" android:state_pressed="true"
android:drawable="@drawable/home_head_login_selected" />
<item android:state_focused="true"android:drawable="@drawable/home_head_login_selected" />
</selector>
只用改变相应的图片就能实现效果。
接下来是tabwidget的不同模式,先看效果
首先是tabwidget在屏幕下方,实现的代码:
<FrameLayout
android:gravity="center"
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:background="@drawable/home_backgroud" >
<LinearLayout android:id="@+id/first"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
</LinearLayout>
</FrameLayout>
<TabWidget
android:id="@android:id/tabs"
android:padding="3.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.0"
android:tabStripEnabled="false"/>
在布局上先在<TabWidget></TabWidget>上面去保留一个<FrameLayout></FrameLayout>标签,来保持位置,这样tabwidget就被“挤”到了屏幕的下方。
android:tabStripEnabled="false"保证了tabwidget的下划线被去掉了。
另外,实现不同的tabwidget的change效果。
myTabHost.setOnTabChangedListener(new OnMyTabChangeListener());来设置监听器
下面是全部代码。
package EPurch.android.app;import android.app.TabActivity;import android.content.Intent;import android.content.pm.ActivityInfo;import android.content.res.Resources;import android.os.Bundle;import android.view.View;import android.view.Window;import android.view.WindowManager;import android.widget.TabHost;import android.widget.TabWidget;import android.widget.TabHost.TabSpec;import android.widget.TabHost.OnTabChangeListener;public class Home extends TabActivity{private TabHost myTabHost ;private TabWidget myTabWidget ;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //强制设置为竖向 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);setContentView(R.layout.home);myTabHost = getTabHost();myTabWidget = getTabWidget();Resources myResources = getResources();TabSpec myTabSpec;Intent intent;intent = new Intent(this,First.class);myTabSpec = myTabHost.newTabSpec("tab1").setIndicator(null, null).setContent(intent);myTabHost.addTab(myTabSpec);intent = new Intent(this,Classify.class);myTabSpec = myTabHost.newTabSpec("tab2").setIndicator(null, null).setContent(intent);myTabHost.addTab(myTabSpec);intent = new Intent(this,Search.class);myTabSpec = myTabHost.newTabSpec("tab3").setIndicator(null, null).setContent(intent);myTabHost.addTab(myTabSpec);intent = new Intent(this,ShopCar.class);myTabSpec = myTabHost.newTabSpec("tab4").setIndicator(null, null).setContent(intent);myTabHost.addTab(myTabSpec);intent = new Intent(this,More.class);myTabSpec = myTabHost.newTabSpec("tab5").setIndicator(null, null).setContent(intent);myTabHost.addTab(myTabSpec);View myView;myView = myTabWidget.getChildAt(0);myView.setBackgroundResource(R.drawable.home_menu_home_selected);myView = myTabWidget.getChildAt(1);myView.setBackgroundResource(R.drawable.home_menu_class_normal);myView = myTabWidget.getChildAt(2);myView.setBackgroundResource(R.drawable.home_menu_search_normal);myView = myTabWidget.getChildAt(3);myView.setBackgroundResource(R.drawable.home_menu_shopping_normal);myView = myTabWidget.getChildAt(4);myView.setBackgroundResource(R.drawable.home_menu_more_normal);myTabHost.setCurrentTab(0);myTabHost.setOnTabChangedListener(new OnMyTabChangeListener());}class OnMyTabChangeListener implements OnTabChangeListener{public void onTabChanged(String tabTag){View myView;switch(myTabHost.getCurrentTab()){case 0 :myView = myTabWidget.getChildAt(0);myView.setBackgroundResource(R.drawable.home_menu_home_selected);myView = myTabWidget.getChildAt(1);myView.setBackgroundResource(R.drawable.home_menu_class_normal);myView = myTabWidget.getChildAt(2);myView.setBackgroundResource(R.drawable.home_menu_search_normal);myView = myTabWidget.getChildAt(3);myView.setBackgroundResource(R.drawable.home_menu_shopping_normal);myView = myTabWidget.getChildAt(4);myView.setBackgroundResource(R.drawable.home_menu_more_normal);break;case 1 :myView = myTabWidget.getChildAt(0);myView.setBackgroundResource(R.drawable.home_menu_home_normal);myView = myTabWidget.getChildAt(1);myView.setBackgroundResource(R.drawable.home_menu_class_selected);myView = myTabWidget.getChildAt(2);myView.setBackgroundResource(R.drawable.home_menu_search_normal);myView = myTabWidget.getChildAt(3);myView.setBackgroundResource(R.drawable.home_menu_shopping_normal);myView = myTabWidget.getChildAt(4);myView.setBackgroundResource(R.drawable.home_menu_more_normal);break;case 2 :myView = myTabWidget.getChildAt(0);myView.setBackgroundResource(R.drawable.home_menu_home_normal);myView = myTabWidget.getChildAt(1);myView.setBackgroundResource(R.drawable.home_menu_class_normal);myView = myTabWidget.getChildAt(2);myView.setBackgroundResource(R.drawable.home_menu_search_selected);myView = myTabWidget.getChildAt(3);myView.setBackgroundResource(R.drawable.home_menu_shopping_normal);myView = myTabWidget.getChildAt(4);myView.setBackgroundResource(R.drawable.home_menu_more_normal);break;case 3 :myView = myTabWidget.getChildAt(0);myView.setBackgroundResource(R.drawable.home_menu_home_normal);myView = myTabWidget.getChildAt(1);myView.setBackgroundResource(R.drawable.home_menu_class_normal);myView = myTabWidget.getChildAt(2);myView.setBackgroundResource(R.drawable.home_menu_search_normal);myView = myTabWidget.getChildAt(3);myView.setBackgroundResource(R.drawable.home_menu_shopping_selected);myView = myTabWidget.getChildAt(4);myView.setBackgroundResource(R.drawable.home_menu_more_normal);break;case 4 :myView = myTabWidget.getChildAt(0);myView.setBackgroundResource(R.drawable.home_menu_home_normal);myView = myTabWidget.getChildAt(1);myView.setBackgroundResource(R.drawable.home_menu_class_normal);myView = myTabWidget.getChildAt(2);myView.setBackgroundResource(R.drawable.home_menu_search_normal);myView = myTabWidget.getChildAt(3);myView.setBackgroundResource(R.drawable.home_menu_shopping_normal);myView = myTabWidget.getChildAt(4);myView.setBackgroundResource(R.drawable.home_menu_more_selected);break;}}}}
大家如果有更好的建议,可以留言,咱一起分享。
更多相关文章
- Android之NDK开发详解
- Android(安卓)UI开发第十二篇——动画效果Animation
- Android(安卓)studio百度地图SDK开发 2020最新超详细的Android(
- Android(安卓)Flutter 混合开发高仿大厂App
- Android(安卓)底层开发概述(四)
- Android安卓开发知识库汇总
- 在IntelliJ IDEA搭建Android开发环境
- android,java,ndk,c++ iphone 之争
- Android(安卓)开发环境下载地址 -- 百度网盘 adt-bundle android