Android第一个项目 SuperProfile 记录(更新中)
2015-01-31 17:52
435 查看
————此为完成《疯狂Android》初次览后的第一次试水,也算是对前面所学知识的第一次总结性回顾SuperProfile设计路程与问题记录此应用旨在设计出智能的、人性化的系列情景模式,纵观应用Android市场,也找不到一款能够让人满意的情景模式软件,此想法早在2013年初识Android时就已产生TabHostgetTabHost()newTabSpec(String tag)addTab(TabHost.TabSpec tabSpec)组件stylestyle.xml<resources> <!-- Base application theme. --> <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> <!-- Customize your theme here. --> </style> <style name="tab_text_view_style_test"> <item name="android:textSize">20dp</item> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:layout_centerHorizontal">true</item> </style></resources>main.xml<TextView style="@style/tab_text_view_style_test" android:text="@string/tab2_content" />手势GestureActivity必须 extends TabActivity implements OnGestureListener
Howto make a scrollable TableLayout?Encase the whole thing in:
public abstract boolean onScroll (MotionEvent e1, MotionEvent e2,float distanceX, float distanceY)
获取string.xml文件里面的值有几个不同的地方。1.在AndroidManifest.xml与layout等xml文件里:android:text="@string/resource_name" 2.在activity里:方法一:this.getString(R.string.resource_name); 方法二:getResources().getString(R.string.resource_name); 3.在其他java文件(必须有Context或pplication)方法一: context.getString(R.string.resource_name); 方法二: application.getString(R.string.resource_name); 隐藏APP标题栏2. [代码][XML]代码 ?12345678910111213141516171819 | <? xml version = "1.0" encoding = "utf-8" ?> < manifest xmlns:android = "http://schemas.android.com/apk/res/android" package = "de.vogella.android.temperature" android:versionCode = "1" android:versionName = "1.0" > < application android:icon = "@drawable/icon" android:label = "@string/app_name" > < activity android:name = ".Convert" android:label = "@string/app_name" android:theme = "@android:style/Theme.NoTitleBar.Fullscreen" > < intent-filter > < action android:name = "android.intent.action.MAIN" /> < category android:name = "android.intent.category.LAUNCHER" /> </ intent-filter > </ activity > </ application > < uses-sdk android:minSdkVersion = "9" /> </ manifest > |
3. [代码][Java]代码 跳至 [2] [3] [全屏预览]
?1234567891011121314 | @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); // hide titlebar of application // must be before setting the layout requestWindowFeature(Window.FEATURE_NO_TITLE); // hide statusbar of Android // could also be done later getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); text = (EditText) findViewById(R.id.EditText01); } |
Android: Tabs at the BOTTOM
up vote238downvote | Here's the simplest, most robust, and scalable solution to get tabs on the bottom of the screen. In your vertical LinearLayout, put the FrameLayout above the TabWidgetSet layout_heightto wrap_contentonboth FrameLayout and TabWidget Set FrameLayout's android:layout_weight="1"Set TabWidget's android:layout_weight="0"(0is default, but for emphasis, readability, etc)Set TabWidget's android:layout_marginBottom="-4dp"(toremove the bottom divider)Full code: <?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="5dp"> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="5dp" android:layout_weight="1"/> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0" android:layout_marginBottom="-4dp"/> </LinearLayout> </TabHost>[/code] |
<ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" android:scrollbars="none" android:layout_weight="1"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> ... </ScrollView>[/code]此方法已弃用,现在使用的都是viewpager+fragment 方式实现(滑动标签页http://blog.csdn.net/lizhenmingdirk/article/details/13631813)在郭林blog中的qq应用演示里,旋转屏幕会导致Fragment叠加在一起,在ActivityManifest文件中的Activity属性里添加如下代码可解决问题 android:configChanges="orientation|keyboardHidden|screenSize"ps:很明显切换横竖屏时会触发oncreate事件,成员变量也会重置,因此当屏幕切换后会再次执行到setTabSelection(0);而在执行基中的hideFragments方法时messageFragment等成员变量已重置为空即hideFragments根据条件将不会执行任何代码,即换屏之前的fragment不会被hide掉,FrameLayout布局自然会将所有的fragment迭加显示了.http://blog.csdn.net/guolin_blog/article/details/13171191下面详解ViewPager + Fragment在这里简单说明一下 FragmentStatePagerAdapter 和 FragmentPagerAdapter2个adapter 第一种 fragment状态adapter - 在当前只会存在 前1个fragment 当前 fragment 和 下1个 fragment 其他销毁 ,适合加载多数据第二种 FragmentPagerAdapter - 全部存在,所以不太适合加载 大量的数据 如图片什么的,很容易内存溢出。http://blog.csdn.net/lizhenmingdirk/article/details/13631813如果ViewPager没有和Fragment一起,ViewPager的适配器是PagerAdapter,它是基类提供适配器来填充页面ViewPager内部,当你实现一个PagerAdapter,你必须至少覆盖以下方法:
instantiateItem(ViewGroup, int)
destroyItem(ViewGroup, int, Object)
getCount()
isViewFromObject(View, Object)在需要添加到Activity里的Fragment,class文件中import Fragment的方法,否则会导致错误,如下//import android.os.Bundle;//import android.app.Fragment;//导致错误//import android.view.LayoutInflater;//import android.view.View;//import android.view.ViewGroup;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;ViewPager onPageChangeListener总结onPageScrollStateChanged(int arg0) ,此方法是在状态改变的时候调用,其中arg0这个参数有三种状态(0,1,2)。arg0 ==1的时辰默示正在滑动,arg0==2的时辰默示滑动完毕了,arg0==0的时辰默示什么都没做。当页面开始滑动的时候,三种状态的变化顺序为(1,2,0)onPageScrolled(int arg0,float arg1,int arg2) ,当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法回一直得到调用。其中三个参数的含义分别为:arg0 :当前页面,及你点击滑动的页面arg1:当前页面偏移的百分比arg2:当前页面偏移的像素位置 onPageSelected(int arg0) : 此方法是页面跳转完后得到调用,arg0是你当前选中的页面的Position(位置编号,从0开始计数)更换App标题栏图标一般Android界面里的默认标题栏上左边是有Logo的,且和整个app的logo一样,如果要修改该标题栏图标,则需加以下代码:
getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.qq);[/code]
其中 R.drawable.qq 为自己想要更换的图标。[/code] 注意在写改行代码之前先加一:
requestWindowFeature(Window.FEATURE_LEFT_ICON);不然会报错说没有要求Window.FEATURE_LEFT_ICON这个属性而且该句代码要加在setContentView之前,不然也会报错说没有加在该函数之前。 public class Test01 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_LEFT_ICON); setContentView(R.layout.main); getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.qq); } } 修改标题栏,实现自己的布局:http://blog.csdn.net/jamin0107/article/details/6715678http://mybar.iteye.com/blog/1985910fragment当多个fragment重叠显示时,上层的点击事件会传递到下一层,通俗来说也就是当我们点击上层某个地方从而触发下层的某个事件。一般来说我们在加fragment时会通过replace或add方法来替换某个空FrameLayout,属于动态加载。但有时从xml中定义,通过hide()和show()来控制某个fragment的显示和隐藏,就会出现重叠问题。我们可以在上层fragment加载的布局让它获取整个焦点,从而点击事件会在上层终止。加载的方法之一是:在Fragment布局文件中添加 android:clickable="true"mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity().getSupportFragmentManager());在Fragment里面嵌套Fragment 的话,不要用上面的那句。。。会在ViewPager中出现。有些Fragment 不会加载的情况。。。既ViewPager 加载 Fragment 空白页的情况。。。。所以 Fragment里面嵌套Fragment 的话:一定要用getChildFragmentManager(); mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());fragment 嵌套Fragmenthttp://stackoverflow.com/questions/13757875/getchildfragmentmanager-on-programmatically-dynamically-added-fragments在此之后,是响应innerFragment里的back按钮事件————————————————————————get currently displayed fragmentWhen you add the fragment in your transaction you should use a tag...
fragTrans.replace(android.R.id.content, myFragment, "MY_FRAGMENT");[/code]...and later if you want to check if the fragment is visible:
MyFragment myFragment = (MyFragment)getFragmentManager().findFragmentByTag("MY_FRAGMENT");if (myFragment.isVisible()) {// add your code here}[/code]在onKeyDown定义为static时,内部不能再使用FragmentManager另外,在Fragment中添加Fragment之后,管理添加的Fragment一定要用getChildFragmentManager()在ViewPager的FragmentA之内再添加Fragment1,要在FA内做如下处理(注意是childFM)
getChildFragmentManager().beginTransaction().addToBackStack(null).add(3, new Fragment3()).commit();[/code]
@Overridepublic void onBackPressed() {// If the fragment exists and has some back-stack entryif (mActivityDirectFragment != null && mActivityDirectFragment.getChildFragmentManager().getBackStackEntryCount() > 0){// Get the fragment fragment manager - and pop the backstackmActivityDirectFragment.getChildFragmentManager().popBackStack();}// Else, nothing in the direct fragment back stackelse{// Let super handle the back presssuper.onBackPressed();}}[/code]第一页情景模式内,监听多个按钮之后,在各个case内,不能复用getFragmentManager()// FragmentTransaction transaction = getFragmentManager().beginTransaction();// transaction.addToBackStack(null);// transaction.commit();应使用 getFragmentManager().beginTransaction().addToBackStack(null).commit();TableLayout android:shrinkColumns和android:stretchColumns的值都是以0开始的index,但必须是string值,即用"1,2,5"来表示。可以用"*"来表示allcolumns。而且同一column可以同时设置为shrinkable和stretchable。如果使用TableLayout类的setColumnShrinkable/setColumnStretchable (int columnIndex, boolean isShrinkable)就麻烦些了,需要一个一个column来设置。也可以使用TableLayout的setShrinkAllColumns/setStretchAllColumns来设置all columns。 判断这些column是否shrinkable或stretchable,可以调用isColumnShrinkable/isColumnStretchable(intcolumnIndex),isShrinkAllColumns()/isStretchAllColumns()单元格可以为empty,并且通过android:layout_column可以设置index值实现跳开某些单元格。在TableRow之间,添加View,设置layout_height以及背景色,就可以实现一条间隔线。android:layout_span可以设置合并几个单元格在Fragment中使用findViewById方法时,因为Fragment不继承Content,所以需要使用getActivity().findViewById(...)在Fragment中对Fragment布局的SeekBar进行处理,处理方法应写在Fragment 的onActivityCreated方法中:@Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); //do something}数据存储SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。实现SharedPreferences存储的步骤如下: 一、根据Context获取SharedPreferences对象 二、利用edit()方法获取Editor对象。 三、通过Editor对象存储key-value键值对数据。 四、通过commit()方法提交数据。 具体实现代码如下:
1 publicclass MainActivity extends Activity {2 @Override3 publicvoid onCreate(Bundle savedInstanceState) {4 super.onCreate(savedInstanceState);5 setContentView(R.layout.main);67 //获取SharedPreferences对象8 Context ctx = MainActivity.this;9 SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);10 //存入数据11 Editor editor = sp.edit();12 editor.putString("STRING_KEY", "string");13 editor.putInt("INT_KEY", 0);14 editor.putBoolean("BOOLEAN_KEY", true);15 editor.commit();1617 //返回STRING_KEY的值18 Log.d("SP", sp.getString("STRING_KEY", "none"));19 //如果NOT_EXIST不存在,则返回值为"none"20 Log.d("SP", sp.getString("NOT_EXIST", "none"));21 }22 }这段代码执行过后,即在/data/data/com.test/shared_prefs目录下生成了一个SP.xml文件,一个应用可以创建多个这样的xml文件。如图所示: SP.xml文件的具体内容如下:
1 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>2 <map>3 <string name="STRING_KEY">string</string>4 <int name="INT_KEY" value="0"/>5 <boolean name="BOOLEAN_KEY" value="true"/>6 </map>在程序代码中,通过getXXX方法,可以方便的获得对应Key的Value值,如果key值错误或者此key无对应value值,SharedPreferences提供了一个赋予默认值的机会,以此保证程序的健壮性。如下图运行结果中因为并无值为"NOT_EXIST"的Key,所以Log打印出的是其默认值:“none”。在访问一个不存在key值这个过程中,并无任何异常抛出。 SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。
相关文章推荐
- 【P000-000】第一个项目,暂定为android手机上的简单证券交易费计算系统(源码列表统一在此更新)
- 项目记录15--热更新ulua加入框架测试和.android热更新脚本
- 环境搭建好后的第一个Android 项目
- Android 开发入门问题集:启动模拟器、安装卸载apk、项目调试、导入Android sample并重新生成R.java……【更新】
- Android开源项目源码下载(不断更新中)
- <项目日志1001>ipcamera for android项目准备更新
- Android第一个应用程序helloworld项目详解
- 好久没有更新博客了,记录最近的C/S小项目
- Android学习3--第一个Android项目HelloWorld的建立及剖析
- HelloWord-第一个android项目
- 研究生阶段第一个坑爹项目-sakai第一期修改记录
- android笔记之---第一个android的项目HelloAndroid
- Android开源项目源码下载(不断更新中)
- Eclipse更新ADT 插件导致Android项目报错问题
- 建立android项目后,gen目录下没有R.java,且main.xml修改无法更新R.java
- android eclipse开发插件ADT 14.0.0 更新记录
- 完成第一个android APP的UI项目
- 项目清单文件分析与第一个ANDROID应用的启动过程
- Android JNI学习之第一个入门实例(确实花了不少功夫,也遇到了很多阻碍,不过还好,最终解决,记录下)
- Android 游戏编程之从零开始-----2.1创建第一个Andoroid项目+2.2剖析Android Project 结构