1. onBuildHeaders(List<PreferenceActivity.Header>)
- 通过分析 PreferenceActivity 的源代码,可知 headers 的创建时机是在 onCreate() 的过程中被调用的,如下所示:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(com.android.internal.R.layout.preference_list_content); mListFooter = (FrameLayout)findViewById(com.android.internal.R.id.list_footer); mPrefsContainer = (ViewGroup) findViewById(com.android.internal.R.id.prefs_frame); boolean hidingHeaders = onIsHidingHeaders(); mSinglePane = hidingHeaders || !onIsMultiPane(); String initialFragment = getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT); Bundle initialArguments = getIntent().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS); int initialTitle = getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_TITLE, 0); int initialShortTitle = getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_SHORT_TITLE, 0); if (savedInstanceState != null) { // We are restarting from a previous saved state; used that to // initialize, instead of starting fresh. ArrayList<Header> headers = savedInstanceState.getParcelableArrayList(HEADERS_TAG); if (headers != null) { mHeaders.addAll(headers); int curHeader = savedInstanceState.getInt(CUR_HEADER_TAG, (int) HEADER_ID_UNDEFINED); if (curHeader >= 0 && curHeader < mHeaders.size()) { setSelectedHeader(mHeaders.get(curHeader)); } } } else { if (initialFragment != null && mSinglePane) { // If we are just showing a fragment, we want to run in // new fragment mode, but don't need to compute and show // the headers. switchToHeader(initialFragment, initialArguments); if (initialTitle != 0) { CharSequence initialTitleStr = getText(initialTitle); CharSequence initialShortTitleStr = initialShortTitle != 0 ? getText(initialShortTitle) : null; showBreadCrumbs(initialTitleStr, initialShortTitleStr); } } else { // We need to try to build the headers. onBuildHeaders(mHeaders); // If there are headers, then at this point we need to show // them and, depending on the screen, we may also show in-line // the currently selected preference fragment. if (mHeaders.size() > 0) { if (!mSinglePane) { if (initialFragment == null) { Header h = onGetInitialHeader(); switchToHeader(h); } else { switchToHeader(initialFragment, initialArguments); } } } } } /* 以下省略 */ }
- 我们在继承的 PreferenceActivity 中实现 onCreate() 的过程中必须认清楚,在调用 super.onCreate() 之后才能引用已经初始化的 headers,否则将出错。
struts2是MVC框架
struts2的开发环境搭建 1.找到开发Struts2应用需要使用到的jar文件.- 需要下载struts2
官网:
http://struts.apache.org
下载地址 :
http://struts.apache.org/download.cgi#struts238 版本号:struts2.3.8
说明:
包含:
Apps 应用
Lib 类库文件
Docs 帮助文档
Src 源代码
找它需要开发的jar文件需要解压:或者找到struts-2.3.8-all\struts-2.3.8\apps 下面的文件如下:
提供了一个空白的项目struts2-blank 我们就可以在这个项目上进行开发struts2.
如果开发的过程中需要其他的jar的文件的支持 怎么办?
需要到\struts-2.3.8-all\struts-2.3.8\lib 中找相应的jar文件。
struts2-blank.war项目 怎么解压复制到tomcat中的webapps中 启动tomcat即可
在apache-tomcat\bin 找到 点击启动
观察:
可以打开浏览器IE
输入 http://localhost:8080/struts2-blank
找到解压后的jar文件 :apache-tomcat\webapps\struts2-blank\WEB-INF\lib
对比servlet :
新建一个登陆的项目 :
http://localhost:8080/demo/servlet/demo.do?username=&userpass=
? 参数 get请求方式
? 没有后缀 post请求方式
web.xml文件
<servlet>
<servlet-name>DemoServlet</servlet-name>
<servlet-class>www.csdn.demo.serlvet.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DemoServlet</servlet-name>
<url-pattern>/servlet/demo.do</url-pattern>
</servlet-mapping>
过滤: 过滤器
监听 :监听器
都需要在web.xml文件中配置
客户端 ---->web容器
Web.xml文件---->控制器 servlet---->Model--->数据库
<----------------------------------
Struts2 独有的配置文件
struts.xml文件
存放在什么位置? 配置文件内容是什么?
1、必须位于classes路径下面
开发项目的过程中 我们把它放到src路径下面 编译后就会存放到classes下面
客户端 ---->web容器
Web.xml文件---->控制器 servlet---->Model--->数据库
<----------------------------------
web.xml文件配置 读取struts.xml文件
2.1.3之前:
org.apache.struts2.dispatcher.FilterDispatcher
配置如下: 2.1.3版本后 如下 配置:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:
struts2读取到struts.xml的内容后,以javabean形式存放在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件
Struts1(struts-config.xml) 在web.xml文件中配置是一个servlet
分析第一个struts2的程序启动 :
013-2-26 11:07:38 com.opensymphony.xwork2.util.logging.jdk.JdkLogger info
信息: Parsing configuration file [struts-default.xml]
2013-2-26 11:07:38 com.opensymphony.xwork2.util.logging.jdk.JdkLogger info
信息: Unable to locate configuration files of the name struts-plugin.xml, skipping
2013-2-26 11:07:38 com.opensymphony.xwork2.util.logging.jdk.JdkLogger info
信息: Parsing configuration file [struts-plugin.xml]
2013-2-26 11:07:38 com.opensymphony.xwork2.util.logging.jdk.JdkLogger info
信息: Parsing configuration file [struts.xml]
struts-default.xml
struts-plugin.xml
struts.xml
三个文件启动的过程中 如果有配置相同的 那么后边的会覆盖前面的。
Bug记录:1、java.net.BindException: Address already in use: JVM_Bind
分析: 你使用的tomcat被第二次 或者是n次 启动 以前没有关闭 导致的一个bug
解决方法:关闭 已经启动的tomcat即可。
2、
分析:找不到你请求的 url既是:servlet/demo.do
解决方法: 看你的url是否存在? 如果不存在 根据业务添加。
3、
分析:在服务器端找不到对应的demo的action
Demo.action
/csdn/demo.action
只提示 :demo没有找到
/csdn下面没有找到 demo action
4、Bug
No result defined for action com.opensymphony.xwork2.ActionSupport and result success
分析:No result 没有结果
om.opensymphony.xwork2.ActionSupport struts2所有action基类
5、java.lang.NoSuchMethodException: www.csdn.helloworld.action.DemoAction.execute()
Execute 方法名称写的不匹配
在Android手机的AppWidget上如何打开一个Activity?
一、onUpdate()函数中
//创建一个Intent对象
Intent intent = new Intent(context,MyActivity.class);
intent.setAction(broadCastString);
//设置pendingIntent的作用
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.appwidgetlayout);
//绑定事件
remoteViews.setOnClickPendingIntent(R.id.image_wifi,pendingIntent);
//更新Appwidget
appWidgetManager.updateAppWidget(appWidgetIds,remoteViews);
二、AndroidManifest.xml中注册MyActivity
<activity
android:name="com.example.myappwidget.MyActivity"
android:label="hehe" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
大体的步骤是如此,具体你可以根据自己的要求做出修改