Android TabActivity之感叹

合集下载

android tab用法

android tab用法

android tab用法Android Tab是Android开发中常用的一个UI控件,它能够提供一个选项卡式的界面,方便用户之间的切换和导航。

在这篇文章中,我们将介绍Android Tab的用法和如何在你的应用程序中使用它。

首先,要使用Android Tab,你需要创建一个TabLayout对象。

这个对象可以在XML布局文件中定义,也可以在代码中动态创建。

在XML布局文件中定义TabLayout的示例如下:```xml<android.support.design.widget.TabLayoutandroid:id="@+id/tab_layout"android:layout_width="match_parent"android:layout_height="wrap_content"app:tabMode="fixed"app:tabGravity="fill" />```在代码中创建TabLayout对象的示例代码如下:```javaTabLayout tabLayout = findViewById(R.id.tab_layout);```接下来,你需要为TabLayout添加选项卡。

你可以通过调用TabLayout的addTab()方法来添加选项卡。

每个选项卡都是一个TabLayout.Tab对象,你可以设置选项卡的文本、图标和其他属性。

TabLayout.Tab tab1 = tabLayout.newTab();tab1.setText("Tab 1");tab1.setIcon(R.drawable.tab_icon_1);tab1.setCustomView(yout.custom_tab_view);tabLayout.addTab(tab1);TabLayout.Tab tab2 = tabLayout.newTab();tab2.setText("Tab 2");tab2.setIcon(R.drawable.tab_icon_2);tab2.setCustomView(yout.custom_tab_view);tabLayout.addTab(tab2);```上述代码中,我们创建了两个选项卡,并设置了选项卡的文本、图标和自定义视图(如果需要)。

android测试题及答案

android测试题及答案

android测试题及答案1. Android系统中,Activity的生命周期包含哪些状态?- A. onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()- B. onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy(), onRestart()- C. onCreate(), onStart(), onResume(), onPause(), onStop(), onRestart(), onDestroy()- D. onCreate(), onRestart(), onStart(), onResume(), onPause(), onStop(), onDestroy()答案:C2. 在Android开发中,如何实现Activity之间的数据传递?- A. 使用Intent对象- B. 使用SharedPreferences- C. 使用数据库- D. 使用文件存储答案:A3. Android中,Service和Activity有什么区别?- A. Service没有用户界面,而Activity有- B. Activity没有用户界面,而Service有- C. Service和Activity都没有用户界面- D. Service和Activity都有用户界面答案:A4. Android中,如何实现屏幕旋转时Activity数据的保存和恢复? - A. 重写onSaveInstanceState()和onRestoreInstanceState()方法- B. 重写onPause()和onResume()方法- C. 重写onCreate()和onDestroy()方法- D. 重写onStart()和onStop()方法答案:A5. 在Android中,如何监听屏幕的亮灭状态?- A. 使用SensorManager监听光线传感器- B. 使用PowerManager监听电源状态- C. 使用BroadcastReceiver监听ACTION_SCREEN_OFF和ACTION_SCREEN_ON广播- D. 使用Handler定时检测电源状态答案:C6. Android中,如何实现应用的多语言支持?- A. 在res目录下创建不同语言的资源文件,并在代码中动态加载- B. 使用SharedPreferences存储用户选择的语言,并在代码中动态加载- C. 在代码中硬编码不同语言的字符串- D. 使用第三方库自动翻译应用内容答案:A7. 在Android开发中,如何实现应用的后台运行?- A. 使用Service- B. 使用BroadcastReceiver- C. 使用ContentProvider- D. 使用IntentService答案:A8. Android中,如何实现应用的权限请求?- A. 在AndroidManifest.xml中声明权限- B. 在代码中动态请求权限- C. 同时使用A和B- D. 无需请求权限答案:C9. Android中,如何实现应用的横竖屏切换?- A. 在AndroidManifest.xml中设置Activity的android:screenOrientation属性- B. 在代码中动态设置Activity的requestedOrientation属性 - C. 使用SensorManager监听屏幕旋转事件- D. 使用Handler定时检测屏幕旋转状态答案:A10. 在Android开发中,如何实现应用的内存优化?- A. 避免内存泄漏- B. 减少Bitmap的使用- C. 使用对象池- D. 以上都是答案:D结束语:以上是Android测试题及答案,希望对您的学习和工作有所帮助。

Android中实现可滑动的Tab的3种方式

Android中实现可滑动的Tab的3种方式

Android中实现可滑动的Tab的3种⽅式该⽅法会有⼀个Bug,当设置tabHost.setCurrentTab()为0时,ViewPager不显⽰(准确的说是加载),只有点击其他任意⼀个tab后才会加载。

有解的同学吼⼀声~~~~~~~Activity:复制代码代码如下:package com.swordy.demo.android.fragment;import java.util.Random;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentStatePagerAdapter;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import youtInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.TabHost;import android.widget.TabHost.OnTabChangeListener;import android.widget.TabWidget;import android.widget.TextView;import com.swordy.demo.android.R;import com.swordy.library.android.util.ELog;/*** 1. 使⽤TabHost和ViewPager组合实现⼀个可以滑动的tab* 2. bug:如果当前页为0,则ViewPager第⼀次不加载。

android-Activity详解

android-Activity详解

Activity详解1.什么是Activity?Activity是一个应用程序组件,代表用来与用户进行交互的界面.比如,发邮件,拍照等的交互界面.一个应用程序通常由多个Activity松耦合的组成,典型的,当用户启动一个应用程序时见到的第一个交互界面(Activity)就叫做主Activity.当然,为了完成相应的动作,一个Activity可以启动另一个Activity;比如qq登陆界面,填写信息之后,发送一个信息去验证,通过之后就启动主界面Activity.每当启动一个新的Activity,前一个Activity将停止,但是系统将仍然保存这个对象在后台栈(back stack)里面。

当启动一个新的Activity,它将被放入back stack中,并且获得用户焦点。

Back stack遵循后进先出原则,所以当用户按手机上的back按钮时,当前的activity将会从back stack中移除,前一个Activity将被恢复。

(Back stack请参考Tasks and Back Stack文档)。

当然,Activity的创建,启动,恢复,暂停,停止,销毁都对应了一系列Activity的回调函数。

2.创建Activity。

创建一个Activity,需要继承Activity超类或继承自继承了Activity的子类。

在你实现的子类中,你需要实现由系统在Activity状态发生变化时调用的各个回调函数。

例如创建,暂停,停止等时会由系统调用对应的方法。

这里介绍两个很重要的方法:onCreate() : 这个方法是必须实现的。

当在创建一个Activity时候由系统调用。

在该方法里面,你应当初始化一些组件;最重要的是,你必须设置setContentView()方法来设置activity布局。

onPause() :当你离开该activity时将被调用,在这个方法里你可以保存一些信息到数据库或文件等。

一.实现用户界面。

软件开发人员实习心得3篇_实习心得体会_

软件开发人员实习心得3篇_实习心得体会_

软件开发人员实习心得3篇实习是我们步入社会的桥梁,是一个能帮助我们完成校园人到社会人转变的过渡阶段,本文为实习心得,欢迎大家阅读借鉴。

软件开发人员实习心得一:在大学里的最后一个冬天,我完成了3个月的实习,实习对我而言是一个难忘的体验,让我不论做人还是做事都改变了很多。

总的来说,虽然说不上乐在其中,但实习的确是一段充实而有意义的事。

实习期间积蓄了太多太多的感悟。

借此机会跟大家分享一二。

感悟一: 当我们进入社会工作,就先要进入各种规范中去。

作为一个软件开发人员,记得在我第一天进入公司实习的时候,首先要学习的就是编程规范。

相信每个搞开发的同学都跟我一样吧。

编程规范在学校里是十分不重视的。

老师也不会硬性地要求学生要遵照怎样的规范去编写代码,实验或者作业什么的,只要能实现功能就ok了。

但是公司却不一样,公司的代码并不是一个人编写,别人很可能需要阅读甚至修改你的代码,阅读一个不符合规范的代码,所需要的时间可能比重新开发还要漫长。

代码规范的重要性是不言而喻的。

当然,作为一个开发人员的前提,我还是公司里的一个员工(虽然不是正式的。

)。

我还必须遵守员工的规范。

其实员工规范也没有什么特别多的要求,个人认为就跟上学差不多,虽然规范是差不多,心态上却有着很大的差异。

原因无他,你到学校是自己交钱上学,上班却是别人发工资给你。

拿了人家钱,还要扰乱人家的规范,这种事我还真干不出来。

看来钱不论到哪里都是一个问题,呵呵感悟二: 我其实是一种很唯心的动物其实本来,我是写"人其实是一种很唯心的动物",但不知道别人是不是也这样,虽然我觉得是,却无从考究,还是严谨点。

为什么说我唯心呢? 当我心里把自己当作一个学生,跟把自己当作一个上班族时,在各种细节上都会不一样,例如那有点虚无缥缈的"气质",或者是说话的语气。

这个大概是"站在不同的高度,看到不同的风景"吧。

正如老总看的是公司发展方向,主管却在看业绩,经理在看项目,小弟们在看代码。

baseactivity topactivity realactivity -回复

baseactivity topactivity realactivity -回复

baseactivity topactivity realactivity -回复baseactivity、topactivity和realactivity是Android开发中的三个关键概念,用于管理和控制不同的Activity。

在本文中,我们将逐步解释这些概念并探讨它们在应用程序中的作用。

在Android应用程序开发中,Activity是用户界面的核心组件之一。

它代表用户可以与之交互的窗口或屏幕。

一个应用程序通常由多个Activity组成,每个Activity都有其特定的功能和用户界面。

在这些Activity中,baseactivity、topactivity和realactivity扮演着不同的角色,并负责管理其他Activity的创建、启动和销毁。

让我们逐一了解它们的作用和功能。

首先是baseactivity。

作为所有Activity的基类,baseactivity提供了一些通用的功能和属性,以便其他Activity继承并使用。

这包括一些共享的方法、变量、布局和资源等。

通过使用baseactivity,开发人员可以避免在每个具体的Activity中编写相同的代码,提高了开发效率。

其次是topactivity。

topactivity代表当前在屏幕上显示的Activity,它可以响应用户的交互事件。

当用户打开一个应用程序时,系统会默认显示topactivity,并将其放置在Activity堆栈的顶部。

这是用户当前在屏幕上看到的Activity,并且能够与用户进行交互。

在一些应用程序中,可能会有多个Activity叠加在屏幕上,但只有一个Activity是处于可见状态的,并接收用户输入。

这个可见的Activity就是topactivity。

开发人员可以通过查询系统提供的API,获取当前的topactivity信息,并据此进行一些相关操作。

最后是realactivity。

realactivity代表已经创建但不可见的Activity。

activity的介绍与使用

activity的介绍与使用

activity的介绍与使用Activity是Android应用程序中的一个关键组件,它提供了用户与应用程序交互的界面。

通过Activity,用户可以执行各种操作,如查看信息、输入数据、浏览网页等。

在Android应用程序开发中,Activity的使用非常广泛,可以说是Android应用程序的基础。

让我们来了解一下Activity的基本概念和特点。

Activity是Android应用程序的核心组件之一,它是一个单独的屏幕,用于展示用户界面。

每个Activity都有自己的生命周期,包括创建、启动、暂停、恢复、停止和销毁等阶段。

在每个阶段,Activity都可以执行一些特定的操作,如初始化界面、保存数据、响应用户事件等。

在Android应用程序中,一个应用程序通常由多个Activity组成,每个Activity负责展示不同的界面。

通过Activity之间的切换,用户可以在不同的界面之间进行导航。

例如,一个应用程序可能有一个主界面Activity,用于展示应用程序的主要功能;另外,还有一些子界面Activity,用于展示一些次要功能或详细信息。

为了使用Activity,我们需要在AndroidManifest.xml文件中进行配置。

在该文件中,我们需要声明每个Activity的名称、入口点、主题等信息。

通过配置文件,系统可以识别并启动相应的Activity。

在开发过程中,我们可以通过继承Activity类来创建自定义的Activity。

通过重写Activity类中的方法,我们可以实现自己的业务逻辑。

例如,我们可以重写onCreate()方法,在该方法中初始化界面和数据;我们还可以重写onPause()方法,在该方法中保存数据和释放资源。

除了基本的生命周期方法外,Activity还提供了一些其他的方法,用于处理用户事件、与其他组件进行交互等。

例如,我们可以通过setOnClickListener()方法为按钮设置点击事件监听器;我们还可以通过startActivity()方法启动其他Activity。

Android TabActivity之感叹

Android TabActivity之感叹

Android TabActivity之感叹(一)前言ams帖子地址:thread-1008812-1.html在以前一篇帖子讲ams的时候,提了一下TabActivity。

当时说它比较特殊就没有下文了,今天重发一篇帖子,跟大家探讨一下TabActivity。

做个假定先:比如我们最外面的Activity是MainActivity, 第一个tab是FirstActivty, 第二个tab 是SecondActivity .相信大家都用过TabActivity, 它是一个特殊的Activity,它特殊的地方在哪里?有以下几点为证:a. 它看起来违反了Activity的单一窗口的原则。

因为它可以同时加载几个activity,当用户点击它上面的tab时,就会跳到相应的Activity上面去。

b. 用户首先进去FirstActivity,然后进去SecondActivity,再点击返回键的时候。

它返回的界面不是FirstActivity,而是退出我们的应用程序。

c. 当用户在FirstActivity按返回键的时候,如果MainActivity和FirstActivity通过重写onKeyDown()方法,那么收到事件回调的只有FirstActivity。

(二)TabActivity存在必要性以及google当时的困扰a. 首先我们要明白一点,android系统是单窗口系统,不像windows是多窗口的(比如在windows 系统上,我们可以一边聊QQ,一边斗地主等等)。

也就是说,在一个时刻,android里面只有一个activity可以显示给用户。

这样就大大降低了操作系统设计的复杂性(包括事件派发等等).b. 但是像TabActivity那种效果又非常必要,用户体验也比较好。

所以我觉得当时google开发人员肯定很纠结。

于是,一个畸形的想法产生了,就是在单窗口系统下加载多个activity,它就是TabActivity。

Android学习笔记(三)Activity及Intent

Android学习笔记(三)Activity及Intent

Android学习笔记(三)Activity及Intent⼀、废话 今天⼗分的忙,本来打算今天就不写了,可是想想既然决定要做某件事情了,那么就要坚持下去。

做不做是⼀个态度问题!⼆、正⽂1、Activity 在⼀个Android应⽤程序中,Activity是为⽤户操作⽽展⽰的可视化界⾯。

⽐如你要打电话,这个时候的拨号界⾯就是⼀个Activity,你要发短信给你的⼥朋友,这个短信窗⼝就是⼀个Activity。

Activity在创建之初只是⼀个没有任何内容的页⾯,如果要做出⽤户体验⾮常棒的应⽤程序,还需要在Activity中添加控件(如按钮,⽂字,图⽚)以显⽰和响应⽤户操作。

2、在Android中,多个Activity之间如何切换? 在Android 系统中,之所以⼀个Activiyt运⾏过程中可以运⾏另外的Activity,是因为Android在遇到这种情况后,会⾃动创建⼀个任务堆栈,并把这些关联的Activity压⼊堆栈中。

在这个任务堆栈栈顶的Activity就是当前⽤户⼀直操作的Activity,⽽当⼀个新的Activity启动时,这个Activity就必须位于栈顶,⽽当前的Activity就会被压⼊栈的下⼀个位置。

当系统发现内存不够⽤时,会默认清理⼀些长时间没有被使⽤的Activity存放栈。

打个⽐⽅,你在看微博,现在收到⼀条⼥朋友发来的微信,这个时候你打开微信,Android就会将微信的Activity压⼊栈并放在栈顶,使微信的Activity被激活,⽽把本来在栈顶的微博Activity压⼊栈中下⼀个位置。

这样⼀来,当你按Back键时,微信Activity就会弹出栈,新浪Activity位于栈顶于是被激活。

但是当你按下HOME键后,这些Activity都将转到后台运⾏,你使⽤Back是不能再次激活他们的,此时你必须点击应⽤程序才能再次激活它。

那么为什么微信Activity激活时,再按Back微博Activity能够再次激活?这就要从Activity的⽣命周期讲起了。

Android中实现多Tab页应用

Android中实现多Tab页应用

Android中实现多Tab页应用Android上的多Tab是一个什么效果?如果图片看不懂的话,但是使用过Android的微博客户端,那也很清晰了,就是那个样子。

在Android API V4版本以前,可以使用TabActivity来实现多Tab的应用程序 。

从里面的讲解可以看到,这个教程还是相对简单的。

但是在Android API V4版本之后,TabActivity被废弃了不推荐使用,被替换为Fragment, FragmentActivity了,使用新的API后,开发难度提升了不少,其官方教程: 也没有一个完整的示例。

实现思路,这个一定要看。

1. 实现一个Activity extends FragmentActivity。

2. 实现一个Tab页切换的管理类,监听Tab页切换事件,负责控制Fragment显示其内容。

3. 通过TabInfo类实现Tab与Fragment以及Activity之间的关联。

下面是代码实现,就不一一讲解了,感兴趣的同学同学,在评论中讨论。

import java.util.HashMap;import android.content.Context;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentTransaction;import youtInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TabHost;import android.widget.TabHost.OnTabChangeListener;import android.widget.TabHost.TabContentFactory;import android.widget.TabHost.TabSpec;public class MultiTabActivity extends FragmentActivity {private TabHost tabHost = null;private TabManager tabManager = null;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(yout.activity_frame);tabHost = (TabHost)findViewById(android.R.id.tabhost);tabHost.setup();//Initialize the tabsthis.tabManager = new TabManager(this, this.tabHost, android.R.id.tabcontent); Bundle args = new Bundle();TabSpec tabspec;//first frameargs.putInt(“layoutResource”, yout.test_frame);tabspec = this.tabHost.newTabSpec(“Tab1”);tabspec.setIndicator(“Tab1”);this.tabManager.addTab(tabspec, TabFragment.class, args);//second frameargs = new Bundle();args.putInt(“layoutResource”, yout.test_frame2);tabspec = this.tabHost.newTabSpec(“Tab2”);tabspec.setIndicator(“Tab2”);this.tabManager.addTab(tabspec, TabFragment.class, args);//set current tab is not existif (savedInstanceState != null){this.tabHost.setCurrentTab(savedInstanceState.getInt(“tab”));}else{this.tabHost.setCurrentTab(0);}}@Overrideprotected void onSaveInstanceState(Bundle outState){super.onSaveInstanceState(outState);outState.putString(“tab”, this.tabHost.getCurrentTabTag());}/*** helper class* @author**/public static class TabManager implements OnTabChangeListener{private FragmentActivity activity = null;private TabHost tabhost = null;private int containerId = 0;private final HashMap<String, TabInfo> tabInfoMap = new HashMap<String, TabInfo>(); private TabInfo currentTab = null;/*** TabInfo including tab tag, tab class, tab arguments, tab fragment* @author**/static final class TabInfo{private final String tag;private final Class<?> klass;private final Bundle args;private Fragment fragment = null;TabInfo(String tag, Class<?> klass, Bundle args){this.tag = tag;this.klass = klass;this.args = args;}}/*** A dummy tab by default, later it will replace by fragment* @author**/static class DummyTabFactory implements TabContentFactory{private Context context;DummyTabFactory(Context context){this.context = context;}public View createTabContent(String tag) {View view = new View(this.context);view.setMinimumHeight(0);view.setMinimumWidth(0);return view;}}public TabManager(FragmentActivity activity, TabHost tabhost, int containerId){this.activity = activity;this.tabhost = tabhost;this.containerId = containerId;this.tabhost.setOnTabChangedListener(this);}public void addTab(TabSpec tabspec, Class<?> klass, Bundle args){tabspec.setContent(new DummyTabFactory(this.activity));String tag = tabspec.getTag();TabInfo tabInfo = new TabInfo(tag, klass, args);//check is the tab already exist. If so deactivate it bcoz the initiate state is not show. tabInfo.fragment = this.activity.getSupportFragmentManager().findFragmentByTag(tag); if (tabInfo.fragment != null && !tabInfo.fragment.isDetached()){ FragmentTransaction transaction =this.activity.getSupportFragmentManager().beginTransaction();transaction.detach(tabInfo.fragment) mit();}this.tabInfoMap.put(tag, tabInfo);this.tabhost.addTab(tabspec);}public void onTabChanged(String tag) {TabInfo newTab = this.tabInfoMap.get(tag);if (this.currentTab == newTab){return;}FragmentTransaction transaction =this.activity.getSupportFragmentManager().beginTransaction();//detach current tabif (this.currentTab != null && this.currentTab.fragment != null ){ transaction.detach(this.currentTab.fragment);}if (newTab != null){if (newTab.fragment == null){newTab.fragment = Fragment.instantiate(this.activity, newTab.klass.getName(), newTab.args);transaction.add(this.containerId, newTab.fragment, newTab.tag);}else{transaction.attach(newTab.fragment);}}this.currentTab = newTab;transaction mit();this.activity.getSupportFragmentManager().executePendingTransactions();}}/*** The Tab Fragment* @author**/public static class TabFragment extends Fragment{private int layoutResource;/*** this method will be called when call Fragment.* @param resource* @return*/static TabFragment newInstance(int resource){TabFragment fragment = new TabFragment();Bundle args = new Bundle();args.putInt(“layoutResource”, resource);fragment.setArguments(args);return fragment;}public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);Bundle args = this.getArguments();layoutResource = args.getInt(“layoutResource”);}public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){return inflater.inflate(layoutResource, container, false);}}}。

android中activity的作用

android中activity的作用

android中activity的作用
在Android中,Activity是应用程序中的一个组件,它通常用于展示用户界面和响应用户的交互。

活动是一种可以包含用户界面的窗口,可以对用户的输入作出相应并在屏幕上呈现结果。

Activity的主要作用是管理应用程序的生命周期,包括创建、启动、暂停、恢复和销毁。

在创建Activity时,可以通过绑定特定的布局文件来为活动创建用户界面。

当用户与应用程序进行交互时,Activity会响应用户的操作,并且可以通过与其他组件进行交互来改变应用程序的状态。

例如,当用户点击按钮时,Activity可以执行特定的操作或启动其他Activity。

Activity还可以通过使用Intent对象来启动其他Activity或启动其他应用程序。

此外,Activity还可以与其他组件(如服务、广播接收器和内容提供者)进行通信,从而实现更高级别的应用程序功能。

总之,Activity是Android应用程序的重要组件,用于管理用户界面和应用程序状态,以及响应用户的交互和操作。

详解 Android 的 Activity 组件

详解 Android 的 Activity 组件

详解 Android 的 Activity 组件本文详细介绍了 Android 应用编程中 Activity 的生命周期、通信方式和 Intent Filter 等内容,并提供了一些日常开发中经常用到的关于 Activity 的技巧和方法。

通过本文,你可以进一步了接 Android 中 Activity 的运作方式。

Activity 的生命周期在 android 中,Activity 的生命周期交给系统统一管理。

android 中的所有的 Activity 都是平等的。

Activity 的状态及状态间的转换在 android 中,Activity 拥有四种基本状态:1. Active/Runing一个新 Activity 启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。

2. Paused当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖时的状态。

此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。

3. Stoped当 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时处于Stoped状态。

4. Killed Activity 被系统杀死回收或者没有被启动时处于Killed状态。

当一个 Activity 实例被创建、销毁或者启动另外一个 Activity 时,它在这四种状态之间进行转换,这种转换的发生依赖于用户程序的动作。

下图说明了 Activity 在不同状态间转换的时机和条件:图 1. Activity 的状态转换如上所示,Android 程序员可以决定一个 Activity 的“生”,但不能决定它的“死”,也就时说程序员可以启动一个 Activity,但是却不能手动的“结束”一个 Activity。

当你调用Activity.finish()方法时,结果和用户按下 BACK 键一样:告诉 Activity Manager 该Activity 实例完成了相应的工作,可以被“回收”。

学软件开发心得体会7篇

学软件开发心得体会7篇

学软件开发心得体会7篇(实用版)编制人:__________________审核人:__________________审批人:__________________编制单位:__________________编制时间:____年____月____日序言下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!并且,本店铺为大家提供各种类型的实用资料,如工作总结、工作报告、工作计划、心得体会、讲话致辞、教育教学、书信文档、述职报告、作文大全、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor.I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!Moreover, our store provides various types of practical materials for everyone, such as work summaries, work reports, work plans, reflections, speeches, education and teaching, letter documents, job reports, essay summaries, and other materials. If you want to learn about different data formats and writing methods, please stay tuned!学软件开发心得体会7篇只有积极参加相关的活动我们才能写出具有感染力的心得体会,只有摆正个人心态,我们才能将体会写的出色,本店铺今天就为您带来了学软件开发心得体会7篇,相信一定会对你有所帮助。

Android 5去除叹号的方法

Android 5去除叹号的方法

Android 5去除叹号的方法Q:最近我将Nexus5的系统更新到Android 5.1.1,结果移动网络和Wi-Fi网络的图标都有一个叹号。

本来我自己也不是太在意,结果发现电量消耗激增,实在不能容忍。

请问有没有什么破解方法?A:问题主要由于从Android 5开始,引入了一种新的网络评估机制,而该机制需要连接到国外的服务器。

由于服务器连接不成功,所以就会出现这个叹号图标。

可借助网友制作的修改器来解决。

上面的方法虽然比较简单,但是需要Android系统ROOT才行。

如果你的系统没有ROOT过,可以进入到手机的设置窗口。

点击列表中的“添加用户”命令,此时会提示需要网络连接,一直点击“下一步”连接网络,当进行到正在联网时,强制关机后再开机就可以了。

在苹果iOS系统里面自定义词组Q:每个人都有自己不同的表达习惯,这样输入的词组也往往是不相同的,所以自定义一些词组在所难免。

请问在iOS系统里面能不能自定义词组?如果可以的话应该如何进行操作?A:首先在设置窗口中点击“通用”项,选择列表中的“键盘”。

在弹出的界面中点击“添加新的短语”命令,然后在“短语”和“输入码”中,分别输入需要的短语以及对应的拼音,最后点击“存储”命令保存即可。

当我们返回到“键盘”界面的时候,在“用户词典”中就可以看到刚刚自定义的词组了。

电脑和手机之间文件的快速传播Q:以前我都是通过QQ进行电脑和手机之间的文件传输的,但是利用这种方法必须要登录QQ才可以。

请问有没有更加简单的方法,不需要注册和登录就可以解决?A:首先通过电脑访问这个网站,扫描网页中的二维码下载指定的应用。

接着确认你的电脑与手机在同一个网络环境,按下应用中的“Scan”按钮后再去扫描网页中的二维码,完成电脑与手机的连接,然后将文件拽到网页窗口,就可以传输到手机上面了。

UC浏览器自定义广告过滤规则Q:我平时使用的是UC手机浏览器,虽然它自身就有一些广告过滤功能,但是仍然有一些广告内容无法进行过滤。

android baseactivity的写方法在activity中使用 -回复

android baseactivity的写方法在activity中使用 -回复

android baseactivity的写方法在activity中使用-回复Android BaseActivity的写法是指在Android应用中,为了减少冗余代码和提高代码复用性,我们可以创建一个基类Activity,让所有的Activity 都继承于这个基类Activity。

这样,我们可以将一些公共的操作和功能封装在基类Activity中,在需要的时候直接在子Activity中调用即可。

下面,我将详细介绍如何在Activity中使用Android BaseActivity。

首先,我们需要创建一个BaseActivity类,并让它继承自AppCompatActivity。

在BaseActivity中,我们可以定义一些公共的方法和变量,供所有的子Activity使用。

如下所示:javapublic class BaseActivity extends AppCompatActivity {定义一些公共变量protected ProgressDialog mProgressDialog;定义一些公共方法,如显示进度弹窗protected void showProgressDialog(String message) {if (mProgressDialog == null) {mProgressDialog = new ProgressDialog(this);mProgressDialog.setCancelable(false);mProgressDialog.setCanceledOnTouchOutside(false);}mProgressDialog.setMessage(message);mProgressDialog.show();}定义一些公共方法,如隐藏进度弹窗protected void hideProgressDialog() {if (mProgressDialog != null &&mProgressDialog.isShowing()) {mProgressDialog.dismiss();}}可以定义其它一些公共方法,根据需求自行添加}接下来,在我们的子Activity中,我们只需要让它继承BaseActivity即可。

Androidactivity动画不生效原因及解决方案总结

Androidactivity动画不生效原因及解决方案总结

Androidactivity动画不⽣效原因及解决⽅案总结activity动画⽅式在AndroidMenifest中添加activity的动画属性windowAnimationStyle<item name="android:windowAnimationStyle">@style/anim_fade</item>在activity代码中添加 overridePendingTransitionoverridePendingTransition(int enterAnim,int exitAnim)问题汇总⼀、动画写的有问题⼆、activity theme中设置动画为null,或者parent theme设置动画为null三、overridePendingTransition 使⽤时机问题四、overridePendingTransition 写错地⽅五、onPause与onResume中的overridePendingTransition会覆盖其他位置六、透明度影响动画七、插件化问题导致找不到动画⼀、动画写的有问题动画本⾝出问题的⽅式⽆法⼀⼀列举,常见的有“duration设置为0”,“from与to的值设置相同”。

<alpha xmlns:android="/apk/res/android"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromAlpha="0.0" android:toAlpha="0.0"android:duration="300" /><alpha xmlns:android="/apk/res/android"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromAlpha="0.0" android:toAlpha="1.0"android:duration="0" />⼆、activity theme中设置动画为null,或者parent theme设置动画为null如下:<style name="TestActivityTheme"><item name="android:windowNoTitle">true</item><item name="android:windowIsTranslucent">true</item><item name="android:windowAnimationStyle">@null</item></style><style name="TestActivityTheme" parent="ParentActivityTheme"></style><style name="ParentActivityTheme"><item name="android:windowNoTitle">true</item><item name="android:windowIsTranslucent">true</item><item name="android:windowAnimationStyle">@null</item></style>三、overridePendingTransition 使⽤时机问题overridePendingTransition 源码注释如下:Call immediately after one of the flavors of startActivity(Intent) or finish to specify an explicit transition animation to perform next.As of Build.VERSION_CODES.JELLY_BEAN an alternative to using this with starting activities is to supply the desired animation information through a ActivityOptions bundle to startActivity(Intent, Bundle) or a related function. This allows you to specify a custom animation even when starting an activity from outside the context of the current top activity.Params:enterAnim – A resource ID of the animation resource to use for the incoming activity. Use 0 for no animation.exitAnim – A resource ID of the animation resource to use for the outgoing activity. Use 0 for no animation.其中说了两个overridePendingTransition 的使⽤时机:在startActivity 之后在finish之后如下:startActivity(intent);overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);finish();overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);四、overridePendingTransition 写错地⽅写错地⽅就纯属是开发者的粗⼼,例⼦如下:重写了finish⽅法,但是调⽤的是finishAndRemoveTask@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);initViews();finishAndRemoveTask();}@Overridepublic void finish() {super.finish();overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);}五、onPause与onResume中的overridePendingTransition会覆盖其他位置根据笔者经验,onPause和onResume中如果写了overridePendingTransition,那么其效果会覆盖其他地⽅设置的动画。

Android 标签

Android 标签

Android 标签/TabActivity 深度研究/ 2010年06月19日 10:46 收藏本页何谓标签印象最深刻的应该是这个现在我们将通过一系列的扩展来研究之写道1. 自定义TabActivity 使得标签处于屏幕下方2. 各个标签所用布局既可在 *.xml 中定义也可在 *.java 中定义3. 更改标签布局1. 标签页在屏幕下方写道一个典型的标签Activity 是由2 部分构成的且其id都有规定即:* TabWidget 用于展示标签页 id=tabs* FrameLayout 用于展示隶属于各个标签的具体布局 id=tabcontent* 基本布局如下:Xml代码< ?xml version="1.0" encoding="utf-8"?>< TabHost xmlns:android="/apk/res/android" android:id="@android:id/tabhost"android:layout_width="fill_parent"android:layout_height="fill_parent" >< LinearLayoutandroid:orientation="vertical"android:gravity="bottom"android:layout_width="fill_parent"android:layout_height="fill_parent" >< FrameLayoutandroid:id="@android:id/tabcontent"android:layout_width="fill_parent"android:layout_height="200dip" >< RelativeLayoutandroid:id="@+id/view1"android:orientation="vertical"android:layout_width="fill_parent" android:layout_height="fill_parent">< TextViewandroid:id="@+id/text"android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello to Johnny.Griffin!" android:layout_centerInParent="true" android:textStyle="bold|italic" />< ImageViewandroid:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/robot"接上页android:layout_toLeftOf="@id/text" /> < /RelativeLayout>< TextViewandroid:id="@+id/view2"android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="创新源于模仿!" />< TextViewandroid:id="@+id/view3"android:layout_width="fill_parent"android:layout_height="fill_parent"android:text="欢迎进入 droid 世界!" />< ImageViewandroid:id="@+id/view4"android:layout_width="fill_parent"android:layout_height="fill_parent"android:src="@drawable/robot" />< /FrameLayout>< TabWidgetandroid:id="@android:id/tabs"android:layout_width="fill_parent"android:layout_height="wrap_content" />< /LinearLayout>< /TabHost>< ?xml version="1.0" encoding="utf-8"?>< TabHost xmlns:android="/apk/res/android" android:id="@android:id/tabhost"android:layout_width="fill_parent"android:layout_height="fill_parent" >< LinearLayoutandroid:orientation="vertical"android:gravity="bottom"android:layout_height="fill_parent" >< FrameLayoutandroid:id="@android:id/tabcontent"android:layout_width="fill_parent"android:layout_height="200dip" >< RelativeLayoutandroid:id="@+id/view1"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent">< TextViewandroid:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"接上页android:text="Hello to Johnny.Griffin!"android:layout_centerInParent="true"android:textStyle="bold|italic" />< ImageViewandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:src="@drawable/robot"< /RelativeLayout>< TextViewandroid:id="@+id/view2"android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="创新源于模仿!" />< TextViewandroid:id="@+id/view3"android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="欢迎进入 droid 世界!" /> < p>android:id="@+id/view4"android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/robot" />< /FrameLayout>< TabWidgetandroid:id="@android:id/tabs"android:layout_width="fill_parent" android:layout_height="wrap_content" /> < /LinearLayout>< /TabHost>* 得到TabHost tHost 仅在TabActivity中有效Java代码tHost = this.getTabHost();tHost = this.getTabHost();* 创建4个标签并指定所使用的布局Java代码public static final String Tab1 = "Tab1";public static final String Tab2 = "Tab2";public static final String Tab3 = "Tab3";public static final String Tab4 = "Tab4";public static final String Tab5 = "Tab5";tHost.addTab(tHost.newTabSpec(Tab1).setIndicator("Tab 1",getResources().getDrawable(R.drawable.icon)).setContent(R.id.view1));tHost.addTab(tHost.newTabSpec(Tab2).setIndicator("Tab 2",接上页getResources().getDrawable(R.drawable.beijing_small)).setContent(R.id.view2));tHost.addTab(tHost.newTabSpec(Tab3).setIndicator("Tab 3").setContent(R.id.view3));tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(R.id.view4));public static final String Tab1 = "Tab1";public static final String Tab2 = "Tab2";public static final String Tab3 = "Tab3";public static final String Tab4 = "Tab4";public static final String Tab5 = "Tab5";tHost.addTab(tHost.newTabSpec(Tab1).setIndicator("Tab 1",getResources().getDrawable(R.drawable.icon)).setContent(R.id.view1));tHost.addTab(tHost.newTabSpec(Tab2).setIndicator("Tab 2",getResources().getDrawable(R.drawable.beijing_small)).setContent(R.id.view2));tHost.addTab(tHost.newTabSpec(Tab3).setIndicator("Tab 3").setContent(R.id.view3));tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(R.id.view4));* 设定监听器用于监听标签间切换事件Java代码tHost.setOnTabChangedListener(new OnTabChangeListener(){@Overridepublic void onTabChanged(String tabId) {// TODO Auto-generated method stub}});tHost.setOnTabChangedListener(new OnTabChangeListener(){@Overridepublic void onTabChanged(String tabId) {// TODO Auto-generated method stub}});* emulator 运行情况:2. 在 *.java 中定义标签所需布局Java代码public class CustomLayout implements TabHost.TabContentFactory { Activity activity;LayoutInflater inflaterHelper;LinearLayout layout;public CustomLayout (Activity a) {activity = a;接上页inflaterHelper = a.getLayoutInflater();}/** {@inheritDoc} *///tag 标记各个标签public View createTabContent(String tag) {return addCustomView(tag);}public View addCustomView(String id){layout = new LinearLayout(activity);layout.setOrientation(LinearLayout.VERTICAL);if(id.equals(Tab1)){ImageView iv = new ImageView(activity);iv.setImageResource(R.drawable.beijing_big);layout.addView(iv,new youtParams(youtParams.FILL_PARENT, youtParams.FILL_PARENT));}else if(id.equals(Tab2)){EditText edit = new EditText(activity);layout.addView(edit,new youtParams(youtParams.FILL_PARENT, youtParams.FILL_PARENT));Button btn = new Button(activity);btn.setText("OK");btn.setWidth(100);layout.addView(btn,new youtParams(youtParams.FILL_PARENT, youtParams.FILL_PARENT));RadioGroup rGroup = new RadioGroup(activity);rGroup.setOrientation(LinearLayout.HORIZONTAL);RadioButton radio1 = new RadioButton(activity);radio1.setText("Radio A");rGroup.addView(radio1);RadioButton radio2 = new RadioButton(activity);radio2.setText("Radio B");rGroup.addView(radio2);layout.addView(rGroup,new youtParams(youtParams.WRAP_CONTENT, youtParams.WRAP_CONTENT));}else if(id.equals(Tab3)){youtParams param3 =new youtParams(youtParams.FILL_PARENT, youtParams.FILL_PARENT);layout.addView(inflaterHelper.inflate(yout.hello, null),param3);接上页}else if(id.equals(Tab4)){TextView tv = new TextView(activity);tv.setText("HelloTags!");tv.setGravity(Gravity.CENTER);layout.addView(tv);}return layout;}}public class CustomLayout implements TabHost.TabContentFactory { Activity activity;LayoutInflater inflaterHelper;LinearLayout layout;public CustomLayout (Activity a) {activity = a;inflaterHelper = a.getLayoutInflater();}/** {@inheritDoc} *///tag 标记各个标签public View createTabContent(String tag) {return addCustomView(tag);}public View addCustomView(String id){layout = new LinearLayout(activity);layout.setOrientation(LinearLayout.VERTICAL);if(id.equals(Tab1)){ImageView iv = new ImageView(activity);iv.setImageResource(R.drawable.beijing_big);layout.addView(iv,new youtParams(youtParams.FILL_PARENT, youtParams.FILL_PARENT));}else if(id.equals(Tab2)){EditText edit = new EditText(activity);layout.addView(edit,new youtParams(youtParams.FILL_PARENT, youtParams.FILL_PARENT));Button btn = new Button(activity);btn.setText("OK");btn.setWidth(100);layout.addView(btn,new youtParams(youtParams.FILL_PARENT, youtParams.FILL_PARENT));RadioGroup rGroup = new RadioGroup(activity);rGroup.setOrientation(LinearLayout.HORIZONTAL);RadioButton radio1 = new RadioButton(activity);radio1.setText("Radio A");rGroup.addView(radio1);RadioButton radio2 = new RadioButton(activity);接上页radio2.setText("Radio B");rGroup.addView(radio2);layout.addView(rGroup,new youtParams(youtParams.WRAP_CONTENT, youtParams.WRAP_CONTENT));}else if(id.equals(Tab3)){youtParams param3 =new youtParams(youtParams.FILL_PARENT, youtParams.FILL_PARENT);layout.addView(inflaterHelper.inflate(yout.hello, null),param3);}else if(id.equals(Tab4)){TextView tv = new TextView(activity);tv.setText("HelloTags!");tv.setGravity(Gravity.CENTER);layout.addView(tv);}return layout;}}* 如何使用:Java代码CustomLayout ct = new CustomLayout(this);tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(ct));CustomLayout ct = new CustomLayout(this);tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(ct));* emulator 运行结果:3. 改变标签布局写道可能很多人对TabActivity 不满意原因之一:其很不美观而不美观的根源就是:标签的问题其图像和文字相互覆盖导致的那么我们可以自己扩展么? 当然写道TabWidget 理解:1. TabWidget 为 horizontal 的 LinearLayout2. 且其包含的标签又是一个RelativeLayout3. 每个标签RelativeLayout 里面包含2个View: TextView ImageView因此我们甚至可以推算出其布局为:Java代码< ?xml version="1.0" encoding="utf-8"?>< LinearLayout xmlns:android="/apk/res/android"android:orientation="horizontal"接上页android:layout_width="fill_parent"android:layout_height="fill_parent">< RelativeLayoutandroid:orientation="vertical"android:layout_width="fill_parent"android:layout_height="wrap_content">< ImageView />< TextView />< /RelativeLayout>< RelativeLayoutandroid:orientation="vertical"android:layout_width="fill_parent"android:layout_height="wrap_content">< ImageView />< TextView />< /RelativeLayout>< RelativeLayoutandroid:orientation="vertical"android:layout_width="fill_parent"android:layout_height="wrap_content">< ImageView />< TextView />< /RelativeLayout>< RelativeLayoutandroid:orientation="vertical"android:layout_width="fill_parent"android:layout_height="wrap_content">< ImageView />< TextView />< /RelativeLayout>< /LinearLayout>< ?xml version="1.0" encoding="utf-8"?>< LinearLayout xmlns:android="/apk/res/android" android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="fill_parent">< RelativeLayoutandroid:orientation="vertical"android:layout_width="fill_parent"android:layout_height="wrap_content">< ImageView />< TextView />< /RelativeLayout>< RelativeLayoutandroid:orientation="vertical"android:layout_width="fill_parent"android:layout_height="wrap_content"> 接上页< ImageView />< TextView />< /RelativeLayout>< RelativeLayoutandroid:orientation="vertical"android:layout_width="fill_parent"android:layout_height="wrap_content"> < ImageView />< TextView />< /RelativeLayout>< RelativeLayoutandroid:orientation="vertical"android:layout_width="fill_parent"android:layout_height="wrap_content"> < ImageView />< TextView />< /RelativeLayout>< /LinearLayout>* 去掉系统默认的布局即在 setIndicator() 中置空修改如下:Java代码tHost.addTab(tHost.newTabSpec(Tab1).setIndicator("").setContent(ct));tHost.addTab(tHost.newTabSpec(Tab1).setIndicator("").setContent(ct));写道可能有人会说:那我不调用setIndicator() 不久可以了么不行否则会报错* 自己定义布局并指定显示的内容Java代码public View composeLayout(String s, int i){LinearLayout layout = new LinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);TextView tv = new TextView(this);tv.setGravity(Gravity.CENTER);tv.setSingleLine(true);tv.setText(s);layout.addView(tv,new youtParams(youtParams.FILL_PARENT, youtParams.WRAP_CONTENT));ImageView iv = new ImageView(this);iv.setImageResource(i);layout.addView(iv,new youtParams(youtParams.FILL_PARENT, youtParams.WRAP_CONTENT));return layout;}public View composeLayout(String s, int i){LinearLayout layout = new LinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);接上页TextView tv = new TextView(this);tv.setGravity(Gravity.CENTER);tv.setSingleLine(true);tv.setText(s);layout.addView(tv,new youtParams(youtParams.FILL_PARENT, youtParams.WRAP_CONTENT));ImageView iv = new ImageView(this);iv.setImageResource(i);layout.addView(iv,new youtParams(youtParams.FILL_PARENT, youtParams.WRAP_CONTENT));return layout;}* 得到 TabWidget 实例 twJava代码LinearLayout ll=(LinearLayout)tHost.getChildAt(0);tw =(TabWidget)ll.getChildAt(1);LinearLayout ll=(LinearLayout)tHost.getChildAt(0);tw =(TabWidget)ll.getChildAt(1);* 得到 TabWidget 内的具体某个Layout 并使用上面的布局 composeLayout()Java代码public void updateWidgetView(int i,String text,int image){RelativeLayout rl =(RelativeLayout)tw.getChildAt(i);rl.addView(composeLayout(text,image));}public void updateWidgetView(int i,String text,int image){RelativeLayout rl =(RelativeLayout)tw.getChildAt(i);rl.addView(composeLayout(text,image));}* emulator 运行截图 // 前面 3个是使用新布局最后一个是使用TabActivity 默认的布局哪个好看大家自己选择之that's all!。

Android学习之Activity属性设置

Android学习之Activity属性设置

Activity是Android组件中最基本也是最为常见用的四大组件之一,在android开发中,运用极为广泛,作为初学者需要熟练掌握,下例为Activity属性常用设置。

android:allowTaskReparenting是否允许activity更换从属的任务,比如从短信息任务切换到浏览器任务。

android:alwaysRetainTaskState是否保留状态不变,比如切换回home, 再从新打开, activity处于最后的状态android:clearTaskOnLanunch比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 从新启动 P,是否显示 Qandroid:configChanges当配置list发生修改时,是否调用 onConfigurationChanged() 方法比如"locale|navigation|orientation".android:enabledactivity 是否可以被实例化,android:excludeFromRecents是否可被显示在最近打开的activity列表里android:exported是否允许activity被其它程序调用android:finishOnTaskLaunch是否关闭已打开的activity当用户重新启动这个任务的时候android.iconandroid:labelandroid:launchModeactivity启动方式, "standard" "singleTop" "singleTask" "singleInstance"其中前两个为一组,后两个为一组android:multiprocess允许多进程android:nameactivity的类名,必须指定androidnHistory是否需要移除这个activity当用户切换到其他屏幕时。

android应用底部导航栏(选...

android应用底部导航栏(选...

android应用底部导航栏(选项卡)实例(Android application examples of the navigation bar at the bottom (TAB))Android应用底部导航栏(选项卡)实例Android应用底部导航栏(选项卡)实例现在很多Android的应用都采用底部导航栏的功能,这样可以使得用户在使用过程中随意切换不同的页面,现在我采用TabHost组件来自定义一个底部的导航栏的功能。

我们先看下该演示实例的框架图:其中各个类的作用以及资源文件就不详细解释了,还有资源图片(在该演示中借用了其它应用程序的资源图片)也不提供了,大家可以自行更换自己需要的资源图片。

直接上各个布局文件或各个类的代码:【1】RES /布局目录下的maintabs.xml源码:<?xml version=“1”encoding=“utf-8”?> < TabHost Android:ID =“@安卓:身份证:layout_width AndroidTabHost”=“fill_parent“Android:layout_height=“fill_parent“xmlns:Android =“http:/ /架构。

Android。

COM / APK /物/ Android”> < LinearLayout Android定位=“垂直”安卓:layout_width =“fill_parent“Android:layout_height=“fill_parent”> < FrameLayout Android:id =“@安卓:身份证/ tabcontent“Android:layout_width =“fill_parent“Andro id:layout_height =“0.0dip“Android:layout_weight =“1”> <标签控件id =“@安卓Android::身份证/标签:“Android知名度=“走了”安卓:layout_width =“fill_parent“Android:layout_height =“wrap_content“Android:layout_weight =“0”> < RadioGroup Android:重力=“center_vertical“Android:layout_gravity=“底层”Android的定位=“横向”Android:id =“@ ID /main_radio”Android的背景=“@冲/maintab_toolbar_bg“Android:layout_width=“fill_parent“Android:layout_height =“wrap_content”> < RadioButton Android:id =“@ ID / radio_button0“Android:layout_margintop =“2.0dip“Android:文本=“”字符串/main_home“Android:drawabletop =“@冲/ icon_1_n”style=“@风格/ main_tab_bottom”/> < RadioButton Android:ID =“@ ID / radio_button1“Android:layout_margintop =“2.0dip“Android:文本=“@字符串/ main_news“Android:drawabletop =“@冲/icon_2_n”风格=“”风格/ main_tab_bottom”/> < RadioButton Android:id =“@ ID / radio_button2“Android:layout_margintop =“2.0dip“Android:文本=“@字符串/main_manage_date“Android:drawabletop =“@冲/icon_3_n”style=“@风格/ main_tab_bottom”/> < RadioButton Android:ID =“@ ID / radio_button3“Android:layout_margintop =“2.0dip“Android:文本=“@字符串/ main_friends“Android:drawabletop =“@冲/ icon_4_n”style=“@风格/main_tab_bottom”/> < RadioButton安卓:ID =“@ ID /radio_button4 Android:layout_margintop =“2”。

Activity详解

Activity详解

Activity详解 Activity是android应⽤的重要组成单元之⼀(另外3个是Service,BroadcastReceiver和ContentProvider)。

实际应⽤包含了多个Activity,不同的Activity向⽤户呈现不同的操作界⾯。

Android应⽤的多个Activity组成Activity栈,当前活动的Activity位于栈顶。

对于Android 应⽤⽽⾔,Activity主要负责与⽤户交互,并向⽤户呈现应⽤状态。

1 建⽴、配置和使⽤Activity1.1 Activity类简介当⼀个Activity定义出来后,该Activity类何时被实例化、它所包含的⽅法何时被调⽤,这些都不是由开发者来决定,⽽是Android系统决定创建Activity需要重写⼀个或者多个⽅法。

其中最常见的就是onCreate⽅法Activity相关类关系视图AccountAuthenticatorActivity:实现账户管理界⾯的ActivityTabActivity实现Tab界⾯的ActivityListActivity实现列表界⾯的ActivityAliasActivity:别名Activity的基类,启动其他Activity时结束⾃⼰ExpandableListActivity实现可扩展列表界⾯的ActivityLauncherActivity:实现Activity列表界⾯的Activity,当单击列表时,所对应的Activity启动PreferenceActivity:实现程序多参数设置,存储界⾯的Activity 对于Activity的具体⼦类如ListActivity,LauncherActivity,ExpandableActivity等⽆需实现具体的布局⽂件,会⾃动调⽤默认布局⽂件。

⽰例:PreferenceActivity的使⽤Activity⽂件import android.preference.PreferenceActivity;import android.preference.PreferenceFragment;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.Button;import android.widget.Toast;import java.util.List;public class PreferenceActivityTest extends PreferenceActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if(hasHeaders()){Button button = new Button(this);button.setText("设置操作");setListFooter(button);}}public void onBuildHeaders(List<Header> target){loadHeadersFromResource(R.xml.preference_headers, target);}public boolean isValidFragment(String fragmentName){return true;//super.isValidFragment(fragmentName);//return StockPreferenceFragment.class.getName().equals(fragmentName);}public static class Prefs1Fragment extends PreferenceFragment{@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);addPreferencesFromResource(R.xml.preferences);}}public static class Prefs2Fragment extends PreferenceFragment{public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);addPreferencesFromResource(R.xml.display_prefs);String website = getArguments().getString("website");Toast.makeText(getActivity(),"⽹站域名是:" + website, Toast.LENGTH_SHORT).show(); }}}View CodePreference主页布局⽂件<?xml version="1.0" encoding="utf-8"?><preference-headersxmlns:android="/apk/res/android"><!-- 指定启动指定PreferenceFragment的列表项 --><header android:fragment="com.example.penghuster.exampletest.PreferenceActivityTest$Prefs1Fragment"android:icon="@drawable/ic_settings_applications"android:title="程序选项设置"android:summary="设置应⽤的相关选项"/><!-- 指定启动指定PreferenceFragment的列表项 --><header android:fragment="com.example.penghuster.exampletest.PreferenceActivityTest$Prefs2Fragment"android:icon="@drawable/ic_settings_display"android:title="界⾯选项设置 "android:summary="设置显⽰界⾯的相关选项"><!-- 使⽤extra可向Activity传⼊额外的数据 --><extra android:name="website"android:value=""/></header><!-- 使⽤Intent启动指定Activity的列表项 --><headerandroid:icon="@drawable/ic_settings_display"android:title="使⽤Intent"android:summary="使⽤Intent启动某个Activity"><intent android:action="android.intent.action.VIEW"android:data=""/></header></preference-headers>View CodeFragment1布局⽂件<?xml version="1.0" encoding="utf-8"?><PreferenceScreen xmlns:android="/apk/res/android"><!-- 设置系统铃声 --><RingtonePreferenceandroid:ringtoneType="all"android:title="设置铃声"android:summary="选择铃声(测试RingtonePreference)"android:showDefault="true"android:key="ring_key"android:showSilent="true"></RingtonePreference><PreferenceCategory android:title="个⼈信息设置组"><!-- 通过输⼊框填写⽤户名 --><EditTextPreferenceandroid:key="name"android:title="填写⽤户名"android:summary="填写您的⽤户名(测试EditTextPreference)"android:dialogTitle="您所使⽤的⽤户名为:"/><!-- 通过列表框选择性别 --><ListPreferenceandroid:key="gender"android:title="性别"android:summary="选择您的性别(测试ListPreference)"android:dialogTitle="ListPreference"android:entries="@array/gender_name_list"android:entryValues="@array/gender_value_list"/></PreferenceCategory><PreferenceCategory android:title="系统功能设置组 "><CheckBoxPreferenceandroid:key="autoSave"android:title="⾃动保存进度"android:summaryOn="⾃动保存: 开启"android:summaryOff="⾃动保存: 关闭"android:defaultValue="true"/></PreferenceCategory></PreferenceScreen>View CodeFragment2布局⽂件<?xml version="1.0" encoding="utf-8"?><PreferenceScreen xmlns:android="/apk/res/android"><!-- 设置系统铃声 --><RingtonePreferenceandroid:ringtoneType="all"android:title="设置铃声"android:summary="选择铃声(测试RingtonePreference)"android:showDefault="true"android:key="ring_key"android:showSilent="true"></RingtonePreference><PreferenceCategory android:title="个⼈信息设置组"><!-- 通过输⼊框填写⽤户名 --><EditTextPreferenceandroid:key="name"android:title="填写⽤户名"android:summary="填写您的⽤户名(测试EditTextPreference)"android:dialogTitle="您所使⽤的⽤户名为:"/><!-- 通过列表框选择性别 --><ListPreferenceandroid:key="gender"android:title="性别"android:summary="选择您的性别(测试ListPreference)"android:dialogTitle="ListPreference"android:entries="@array/gender_name_list"android:entryValues="@array/gender_value_list"/></PreferenceCategory><PreferenceCategory android:title="系统功能设置组 "><CheckBoxPreferenceandroid:key="autoSave"android:title="⾃动保存进度"android:summaryOn="⾃动保存: 开启"android:summaryOff="⾃动保存: 关闭"android:defaultValue="true"/></PreferenceCategory></PreferenceScreen>View Code注意:需要重写PreferenceActivity的isValidFragment⽅法1.2 配置ActivityAndroid应⽤要求多有应⽤程序组件(Activity、Service、ContentProvider、BroadcastReceiver)都必须显式进⾏配置只需为<application/>元素添加<Activity />⼦元素即可,另外需要为Activity元素指定⼀个或者多个intent-filter,该元素⽤于指定该Activity可以响应的Intent从DDMS查看PreferenceActivity输出的配置⽂件1.3 启动关闭Activity1.3.1 ⼀个Android应⽤通常会包含多个Activity,但只有⼀个Activity会作为程序⼊⼝-----但Android应⽤运⾏时将会⾃动启动并执⾏该Activity。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

探讨一下TabActivity。

做个假定先:比如我们最外面的Activity是MainActivity, 第一个tab是FirstActivty, 第二个tab 是SecondActivity .
相信大家都用过TabActivity, 它是一个特殊的Activity,它特殊的地方在哪里?有以下几点为证:
a. 它看起来违反了Activity的单一窗口的原则。

因为它可以同时加载几个activity,当用户点击它上面的tab时,就会跳到相应的Activity上面去。

b. 用户首先进去FirstActivity,然后进去SecondActivity,再点击返回键的时候。

它返回的界面不是FirstActivity,而是退出我们的应用程序。

c. 当用户在FirstActivity按返回键的时候,如果MainActivity和FirstActivity通过重写onKeyDown()方法,那么收到事件回调的只有FirstActivity。

(二)TabActivity存在必要性以及google当时的困扰
a. 首先我们要明白一点,android系统是单窗口系统,不像windows是多窗口的(比如在windows系统上,我们可以一边聊QQ,一边斗地主等等)。

也就是说,在一个时刻,android 里面只有一个activity可以显示给用户。

这样就大大降低了操作系统设计的复杂性(包括事件派发等等).
b. 但是像TabActivity那种效果又非常必要,用户体验也比较好。

所以我觉得当时google开发人员肯定很纠结。

于是,一个畸形的想法产生了,就是在单窗口系统下加载多个activity,它就是TabActivity。

(三)TabActivity实现加载多个Activity原理
我们都知道,想启动一个Activity,一般是调用startActivty(Intent i)方法。

然后这个方法会辗转调用到ams(ActivityManagerService)来启动目标activity.
所以,TabActivity实现的要点有两个:
a. 找到一个入口,这个入口可以访问到ActivityThread类(这个类是隐藏的,应用程序是访问不到的),然后调用ActivityThread里面的启动activity方法
b. 绕开ams,就是我们TabActivity加载的FirstActivity和SecondActivity是不能让ams知道的。

所以,一个新的类诞生了---- LocalActivityManager , 它的作用如下:
1. 这个类和ActivityThread处于一个包内,所以它有访问ActivityThread的权限。

2. 这个类提供了类似Ams管理Activity的方法,比如调用activity的onCreate方法,onResume()等等,维护了activity生命周期, 和ams相比,就像西游记里面的大雷音寺和小雷音寺一样。

也正如其名字一样,它是本地的activity管理。

就是说它运行的进程和它管理的Activity 是在一个进程里面。

所以,当TabActivity要启动一个activity的时候,会调用到LocalActivityManager的创建activity 方法,然后调用ActivityThread.startActivityNow(),这个方法绕过了ams,就是说ams此时根本不知道LocalActivityManager已经在暗渡陈仓的启动了一个activity(所以ams的task列表里面没有新启动activity的记录,所以用户按back键就直接退出我们的应用)。

然后和正常启动activity一样,初始化activity,在初始化activity的时候,有个方法非常重要:activity.attch()
final void attach(...){
....
mWindow.setCallback(this);
.....
}
mWindow.setCallback(this); 非常重要,它设置window的回调接口,这是我们activity能够接受到key事件的关键所在!因为在DecorView在接受到事件的时候,会回调这个接口。

如:final Callback cb = getCallback();
final boolean handled = cb != null &&mFeatureId< 0 ? cb.dispatchKeyEvent(event) : super.dispatchKeyEvent(event);
当我们启动FirstActivity的时候,我们设置FirstActivity为PhoneWindow的回调实现,所以,按back键的时候,调用的是FirstActivity的onKeyDown方法。

(四)TabActivity的现状
上面第二点也说了,TabActivity只是个怪胎而已。

所以,在后面的发展中肯定会被代替。

果然,google在android3.0推出了Fragment这个东东,这个东东就可以代替TabActivity.
不可避免的,和TabActivity相关的类都被声明为Deprecated,包括它的父类ActivityGroup,已经LocalActivityManager ....。

相关文档
最新文档