从ActionBar到ToolBar你用了多久(一)
来源:互联网 发布:网络预约驾驶员资格证 编辑:程序博客网 时间:2024/04/27 16:30
ActionBar
Action Bar是一种导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用户动作、界面导航等功能。
好处:它可以给提供一种全局统一的UI界面,使得用户在使用任何一款软件时都懂得该如何操作,并且ActionBar还可以自动适应各种不同大小的屏幕。
添加ActionBar
只需要在AndroidManifest.xml中指定Application或Activity的theme是Theme.Holo或其子类就可以了。
例如:
<activity; android:name=".ActionBarActivity" android:theme="@android:style/Theme.Holo.Light.DarkActionBar"></activity>
效果图如下:
看了效果图你会发现,ActionBar默认的图标和默认标题是来自你的manifest中的一下两项:
<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
那么如何修改ActionBar的标题和图标呢?
将你显示ActionBar的Activity这两个属性改一下就行了。
<activity android:name=".ActionBarActivity" android:icon="@drawable/actionbar_icon" android:label="YOUYUBE" android:theme="@android:style/Theme.Holo.Light.DarkActionBar"></activity>
效果图如下:
在代码中,你还可以通过设置ActionBar的serDisplayShowHomeEanbled(false)和setDisplayShowTitleEanbled(fasle)来禁用操作栏的图标和标题;
具体代码如下:
ActionBar actionBar = getActionBar() ; /** * false:不显示图标 * true:显示图标 */ actionBar.setDisplayShowHomeEnabled(false); /** * false:不显示标题 * true:显示标题 */ actionBar.setDisplayShowTitleEnabled(false);
效果图如下:
你会发现,去除了标题和图标,ActionBar还是存在的,那么怎么移除ActionBar呢??
移除ActionBar
调用ActionBar的hide()方法:
ActionBar actionBar = getActionBar() ; /** * 移除ActionBar */ actionBar.hide();
效果图如下:
如果你的页面不需要ActionBar,你只要把主题不设置成Theme.holo及其子类(带ActionBar的子类),或者设置成android:theme=”@android:style/Theme.Holo.NoActionBar”即可。此外,如果你的主题是Theme.holo及其子类,你在去除ActionBar之后还可以调用ActionBar的show()方法使ActionBar显示出来:
/** * 移除ActionBar */ actionBar.hide(); /** * 显示ActionBar */ actionBar.show();
效果图如下:
给ActionBar添加操作项:
方法一:通过代码添加:
需要重写Activity的onCreateOptionsMenu(Menu menu)方法,对此你可以这么理解,Action Item其实就是之前的旧版本中的MenuItem,只不过把它整合到ActionBar中了。所以,当系统首次启动时,系统会调用onCreateOptionsMenu()方法给Activity的ActionBar添加操作栏和溢出菜单。
/** * 给ActionBar添加操作项 * * @param menu * @return */ @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); /** * Add a new item to the menu. This item displays the given title for its * label. * * @param groupId The group identifier that this item should be part of. * This can be used to define groups of items for batch state * changes. Normally use {@link #NONE} if an item should not be in a * group. * @param itemId Unique item ID. Use {@link #NONE} if you do not need a * unique ID. * @param order The order for the item. Use {@link #NONE} if you do not care * about the order. See {@link MenuItem#getOrder()}. * @param title The text to display for the item. * @return The newly added menu item. */ MenuItem open = menu.add(0, 1, 0, "打开"); MenuItem close = menu.add(0, 2, 1, "关闭"); MenuItem save = menu.add(0, 3, 2, "保存"); MenuItem copy = menu.add(0, 4, 3, "复制"); MenuItem paste = menu.add(0, 4, 3, "粘贴"); /** * 设置Item项的显示方式: * SHOW_AS_ACTION_IF_ROOM:用这种方式,只有在有效的空间时,菜单项才能显示在操作栏中。如果没有足够的空间,这个菜单项会显示在溢出菜单中。 * SHOW_AS_ACTION_WITH_TEXT:示意操作栏要显示文本标题。操作栏会尽可能的显示这个标题,但是,如果图标有效并且受到操作栏空间的限制,文本标题有可能显示不全。 * SHOW_AS_ACTION_NEVER:从不显示在状态栏 * SHOW_AS_ACTION_ALWAYS:总是显示在状态栏 */ open.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); close.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); save.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); copy.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); paste.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); return true; }
效果图如下:
可以看出:"NEVER"的没显示,“Always”的都显示了。
方法二:使用布局文件的方式添加:
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/item_search" android:actionViewClass="android.widget.SearchView" android:showAsAction="always" android:title="搜索" /> <item android:id="@+id/item_open" android:showAsAction="never" android:title="打开" /> <item android:id="@+id/item_save" android:showAsAction="never" android:title="保存" /> <item android:id="@+id/item_copy" android:showAsAction="never" android:title="复制" /> <item android:id="@+id/item_paste" android:showAsAction="never" android:title="粘贴" /> <item android:id="@+id/item_close" android:showAsAction="never" android:title="关闭" /></menu>
@Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.action_items,menu); return true; }
效果图如下:
如果你想菜单有图标,只需要加上icon属性即可。如下:
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/item_search" android:actionViewClass="android.widget.SearchView" android:showAsAction="always" android:title="搜索" /> <item android:id="@+id/item_open" android:showAsAction="never" android:title="打开" /> <item android:id="@+id/item_save" android:showAsAction="never" android:title="保存" /> <item android:id="@+id/item_copy" android:showAsAction="always" android:icon="@drawable/copy" android:title="复制" /> <item android:id="@+id/item_paste" android:showAsAction="always" android:icon="@drawable/paste" android:title="粘贴" /> <item android:id="@+id/item_close" android:showAsAction="never" android:title="关闭" /></menu>
效果图如下:
响应按钮事件
当用户点击Action按钮的时候,系统会调用Activity的onOptionsItemSelected()方法,通过方法传入的MenuItem参数,我们可以调用它的getItemId()方法和menu资源中的id进行比较,从而辨别出用户点击的是哪一个Action按钮。
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.item_open://打开 Toast.makeText(this, "打开", Toast.LENGTH_SHORT).show(); return true; case R.id.item_close://关闭 Toast.makeText(this, "关闭", Toast.LENGTH_SHORT).show(); return true; case R.id.item_save://保存 Toast.makeText(this, "保存", Toast.LENGTH_SHORT).show(); return true; case R.id.item_copy://复制 Toast.makeText(this, "复制", Toast.LENGTH_SHORT).show(); return true; case R.id.item_paste://粘贴 Toast.makeText(this, "粘贴", Toast.LENGTH_SHORT).show(); return true; default: return super.onOptionsItemSelected(item); } }
效果图如下:
通过Action Bar图标进行导航
/** * 设置显示导航图标 */ ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true);
处理部分:
case android.R.id.home: //导航按钮的ID finish();//关闭Activity return true;
效果图:
实现导航功能:
参考博客:Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)
如上的处理过程,其实是和back键功能一致,但是显然,导航设置的初衷并非如此。我们需要的是不管打开几层,都回到最原始的一层,那么如何实现这种效果呢?
显示了导航按钮之后,我们还需要配置其父Activity,如下:
<activity android:name=".ActionBarActivity" android:icon="@drawable/actionbar_icon" android:label="YOUYUBE" android:theme="@android:style/Theme.Holo.Light"> <!--android4.0 之后,也可以使用Activity的android:parentActivityName属性指定父Activity--> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity" /> </activity>
最后,就是对响应事件的处理了:
/** * 调用NavUtils.getParentActivityIntent()方法可以获取到跳转至父Activity的Intent,然后如果父Activity和当前Activity是 * 在同一个Task中的,则直接调用navigateUpTo()方法进行跳转,如果不是在同一个Task中的,则需要借助TaskStackBuilder来创建一个 * 新的Task。这样,就按照标准的规范成功实现ActionBar导航的功能了。 */ Intent upIntent = NavUtils.getParentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities(); } } else { upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); NavUtils.navigateUpTo(this, upIntent); } return true;
对SearchView的设置及操作
/** * 布局方式实现 * * @param menu * @return */ @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.action_items, menu); /** * 对SearchView的处理 * SearchView导的不是V7包 */ MenuItem searchItem = menu.findItem(R.id.item_search); SearchView searchView = (SearchView) searchItem.getActionView(); // 配置SearchView的属性 /** * 通过给android:showAsAction属性添加“collapseActionView”属性值,能够让操作视窗可以折叠起来。 * 如果需要,同时也可以在代码中通过expandActionView()和collapseActionView()方法来展开或折叠操作视窗。 */// searchItem.collapseActionView(); /** * 为 SearchView设置监听器 */ searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { //扩展开的时候 Log.e("TAG", "on expand"); return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) {//缩回的时候 Log.d("TAG", "on collapse"); return true; } }); return super.onCreateOptionsMenu(menu); }
Overflow按钮不显示的情况(摘自郭林大神的博客)
private void setOverflowShowingAlways() { try { ViewConfiguration config = ViewConfiguration.get(this); Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } catch (Exception e) { e.printStackTrace(); }}这里我们在onCreate()方法的最后调用了setOverflowShowingAlways()方法,而这个方法的内部就是使用反射的方式将sHasPermanentMenuKey的值设置成false,现在重新运行一下代码
Overflow中的选项显示图标
默认情况下不显示图标,怎么让他显示呢??重写了onMenuOpened()方法,当overflow被展开的时候就会回调这个方法,接着在这个方法的内部通过返回反射的方法将MenuBuilder的setOptionalIconsVisible变量设置为true就可以了。
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/item_search" android:actionViewClass="android.widget.SearchView" android:showAsAction="always" android:title="搜索" /> <item android:id="@+id/item_open" android:showAsAction="never" android:title="打开" /> <item android:id="@+id/item_save" android:showAsAction="never" android:title="保存" /> <item android:id="@+id/item_copy" android:showAsAction="never" android:icon="@drawable/copy" android:title="复制" /> <item android:id="@+id/item_paste" android:showAsAction="never" android:icon="@drawable/paste" android:title="粘贴" /> <item android:id="@+id/item_close" android:showAsAction="never" android:title="关闭" /></menu>
@Override public boolean onMenuOpened(int featureId, Menu menu) { if (featureId == Window.FEATURE_ACTION_BAR && menu != null) { if (menu.getClass().getSimpleName().equals("MenuBuilder")) { try { Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE); m.setAccessible(true); m.invoke(menu, true); } catch (Exception e) { } } } return super.onMenuOpened(featureId, menu); }}
效果图如下:
Action Provider
ActionProvider和普通的ActionView相比最大的好处是,它能够完全的控制事件,并且可以再点击的时候显示子菜单。
- 在xml配置item时,在标签中加一个actionViewClass属性,在里面填入Action Provider的完整类名。这个类名可以是安卓系统提供给我们的,也可以是自定义的。
- 事件处理,由于其自由控制事件,只需要在onPerformDefaultAction()方法中去执行相应的逻辑即可。
下面看个小例子,你就知道怎么用了:
action_provider.xml
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context=".ActionProviderActivity"> <item android:id="@+id/ap_share" android:actionProviderClass="android.widget.ShareActionProvider" android:title="分享" android:icon="@drawable/paste" android:showAsAction="ifRoom" /></menu>
package com.demon.frames;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.widget.ShareActionProvider;public class ActionProviderActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_acion_provider); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.action_provider,menu); MenuItem item = menu.findItem(R.id.ap_share); ShareActionProvider provider = (ShareActionProvider) item.getActionProvider(); provider.setShareIntent(getShareIntent()); return super.onCreateOptionsMenu(menu); } private Intent getShareIntent() { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("image/*"); return intent; }}
效果图如下:
这里是使用的系统提供的类,我们还可以自定义一个ActionProvider。其实你可以点开ActionProvider的一个子类,看看他怎么实现,然后你就怎么做。这里仅仅举了一个小例子,并没有分析其子类。如下:
package com.demon.frames.bean;import android.content.Context;import android.view.ActionProvider;import android.view.MenuItem;import android.view.SubMenu;import android.view.View;import com.demon.frames.R;/** * Created by demon on 2016/10/15. * 作用:自定义ActionProvider类 */public class ActionProviderMy extends ActionProvider { /** * Creates a new instance. * * @param context Context for accessing resources. */ public ActionProviderMy(Context context) { super(context); } @Override public View onCreateActionView() { return null; } @Override public void onPrepareSubMenu(SubMenu subMenu) { super.onPrepareSubMenu(subMenu); subMenu.clear(); subMenu.add("子菜单一").setIcon(R.drawable.copy).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { return true; } }); subMenu.add("子菜单二").setIcon(R.drawable.paste).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { return false; } }); } @Override public boolean hasSubMenu() { return true; }}action_provider.xml
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context=".activity.ActionProviderActivity"> <item android:id="@+id/ap_share" android:actionProviderClass="android.widget.ShareActionProvider" android:title="分享" android:icon="@drawable/paste" android:showAsAction="ifRoom" /> <item android:id="@+id/ap_myself" android:actionProviderClass="com.demon.frames.bean.ActionProviderMy" android:title="分享" android:icon="@drawable/copy" android:showAsAction="ifRoom" /></menu>
效果图如下:
使用分离操作栏
方法,在manifest文件所对应的Application或者Activity标签配置如下属性:
android:uiOptions="splitActionBarWhenNarrow"
效果图如下:
添加导航标签
主要可以分为以下三步:
1. 实现ActionBar.TabListener接口,这个接口提供了Tab事件的各种回调
package com.demon.frames.bean;import android.app.ActionBar;import android.app.Activity;import android.app.Fragment;import android.app.FragmentTransaction;public class TabListener<T extends Fragment> implements ActionBar.TabListener { private Fragment mFragment; private Activity mActivity; private String mTag; private Class<T> mClass; public TabListener(Activity activity, String tag, Class<T> clz) { mActivity = activity; mTag = tag; mClass = clz; } /** * 当Tab被重新选中的时候会调用onTabReselected()方法,如果没有特殊需求的话,通常是不需要进行处理的。 * @param tab * @param ft */ @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { if (mFragment == null) {//如果为空的话就创建Fragment的实例并调用 mFragment = Fragment.instantiate(mActivity, mClass.getName()); ft.add(android.R.id.content, mFragment, mTag); } else {//如果不会空的话就调用FragmentTransaction的attach()方法 ft.attach(mFragment); } } @Override public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { if (mFragment != null) { ft.detach(mFragment); } } /** * 通常不作处理 * @param tab * @param ft */ @Override public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) { }}
2.为每一个你想添加的Tab创建一个ActionBar.Tab的实例,并且调用setTabListener()方法来设置ActionBar.TabListener。
3.用setText()方法来给当前Tab设置标题。
4.最后调用ActionBar的addTab()方法将创建好的Tab添加到ActionBar中。
package com.demon.frames.activity;import android.app.ActionBar;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.widget.ShareActionProvider;import com.demon.frames.R;import com.demon.frames.bean.TabListener;import com.demon.frames.fragments.AlbumFragment;import com.demon.frames.fragments.ArtistFragment;public class ActionProviderActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_acion_provider); ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ActionBar.Tab tab = actionBar.newTab(). setText("Artist").setTabListener( new TabListener<ArtistFragment>(this, "artist", ArtistFragment.class) ); actionBar.addTab(tab); tab = actionBar.newTab(). setText("Album").setTabListener( new TabListener<AlbumFragment>(this, "album", AlbumFragment.class) ); actionBar.addTab(tab); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.action_provider, menu); MenuItem item = menu.findItem(R.id.ap_share); ShareActionProvider provider = (ShareActionProvider) item.getActionProvider(); provider.setShareIntent(getShareIntent()); return super.onCreateOptionsMenu(menu); } private Intent getShareIntent() { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("image/*"); return intent; }}
效果图如下:
自定义ActionBar的主题
1.自定义背景:
首先自定义style :action_styles.xml
<?xml version="1.0" encoding="utf-8"?><resources> <style name="MyActionStyle" parent="@android:style/Theme.Holo.Light"> <item name="android:actionBarStyle">@style/MyActionBar</item> </style> <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar"> <item name="android:background">#00ff00</item> </style></resources>
其次,引用新定义的style(这里相当于系统主题的子类,就是改变了ActionBar的主题而已)
<activity android:name=".activity.ActionProviderActivity" android:icon="@drawable/actionbar_icon" android:label="YOUYUBE" android:theme="@style/MyActionStyle"></activity>
效果图如下:
你会发现这只改变了上边,下面好像不是ActionBar了似的,感觉有点怪,那么怎么使下面的和上面的一样?
只需要在你的style定义时加上这句就行<item name="android:backgroundStacked">#d27026</item>
如下:
<?xml version="1.0" encoding="utf-8"?><resources> <style name="MyActionStyle" parent="@android:style/Theme.Holo.Light"> <item name="android:actionBarStyle">@style/MyActionBar</item> </style> <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar"> <item name="android:background">#bc0efc</item> <item name="android:backgroundStacked">#bc0efc</item> </style></resources>效果图如下:
标题颜色的设置:
<?xml version="1.0" encoding="utf-8"?><resources> <style name="MyActionStyle" parent="@android:style/Theme.Holo.Light"> <item name="android:actionBarStyle">@style/MyActionBar</item> </style> <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar"> <item name="android:titleTextStyle">@style/MyActionBarTitleText</item> <item name="android:background">#bc0efc</item> <item name="android:backgroundStacked">#bc0efc</item> </style> <style name="MyActionBarTitleText" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title"> <item name="android:textColor">#fff</item> </style></resources>
效果图如下:
把下面的字设成白色:
<?xml version="1.0" encoding="utf-8"?><resources> <style name="MyActionStyle" parent="@android:style/Theme.Holo.Light"> <item name="android:actionBarStyle">@style/MyActionBar</item> <item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item> </style> <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar"> <!--<item name="android:titleTextStyle">@style/MyActionBarTitleText</item>--> <item name="android:background">#bc0efc</item> <item name="android:backgroundStacked">#bc0efc</item> </style> <!--<style name="MyActionBarTitleText" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">--> <!--<item name="android:textColor">#fff</item>--> <!--</style>--> <style name="MyActionBarTabText" parent="@android:style/Widget.Holo.ActionBar.TabText"> <item name="android:textColor">#fff</item> </style></resources>
效果图如下:
<?xml version="1.0" encoding="utf-8"?><resources> <style name="MyActionStyle" parent="@android:style/Theme.Holo.Light"> <item name="android:actionBarStyle">@style/MyActionBar</item> <item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item> </style> <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar"> <item name="android:titleTextStyle">@style/MyActionBarTitleText</item> <item name="android:background">#bc0efc</item> <item name="android:backgroundStacked">#bc0efc</item> </style> <style name="MyActionBarTitleText" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title"> <item name="android:textColor">#fff</item> </style> <style name="MyActionBarTabText" parent="@android:style/Widget.Holo.ActionBar.TabText"> <item name="android:textColor">#fff</item> </style></resources>
- 从ActionBar到ToolBar你用了多久(一)
- 从ActionBar切换到toolBar
- 从ActionBar,沉浸式 再到ToolBar
- ActionBar ToolBar 从0开始
- Android 5.0(L) ToolBar(替代ActionBar) 实战(一)
- Android 5.0(L) ToolBar(替代ActionBar) 实战(一)
- 一探ActionBar和ToolBar的区别
- ToolBar(ActionBar)
- Toolbar,ActionBar
- 又到周末了,给大家分享200000余条笑话! 看你能撑多久!
- 【阅读】你有多久没有用完过一只笔芯了?
- 从PHP到JSP需要多久
- Toolbar 替换ActionBar(android MD 二)
- 如何看你的电脑开了多久了?
- Android自定义工具栏(一)——从ActionBar说起
- 你有多久没有聆听自己内心的声音了?
- 论坛、社区,Web世界你有多久没去了?
- 关于IO时延你被骗了多久?
- android访问权限大权
- php基础(三)
- iOS-APP集成Apple Pay指南-赵鹏举
- Java以UTF-8编码读写文件
- Android DIY之路 (三) 手绘 仅在限定区域留下痕迹 并再现这一过程
- 从ActionBar到ToolBar你用了多久(一)
- easyui
- 使用CheckedOutputStream和CheckedInputStream实现带验证的压缩、解压
- Java 不同路径下加载文件
- sql server 查询最近备份记录
- linux 中 oracle dmp文件导入
- Weblogic报错Authentication denied: Boot identity not valid
- SmartImageView框架使用
- iOS 注册推送失败