一:Fragment中获取onCLick事件,并做出操作
@Override
public void onResume() {
super.onResume();
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode ==
KeyEvent.KEYCODE_BACK){
getActivity().getSupportFragmentManager().beginTransaction().
replace(R.id.id_more_content,moreMainViewListFragment)
.addToBackStack(null).commit();
return true;
}
return false;
}
});
}
二:点击两次退出应用
2.1.第一种实现的基本原理就是,当按下BACK键时,会被onKeyDown捕获,判断是BACK键,则执行exit方法。在exit方法中,会首先判断isExit的值,如果为false的话,则置为true,同时会弹出提示,并在2000毫秒(2秒)后发出一个消息,在Handler中将此值还原成false。如果在发送消息间隔的2秒内,再次按了BACK键,则再次执行exit方法,此时isExit的值已为true,则会执行退出的方法。
// 定义一个变量,来标识是否退出
private static boolean isExit = false;
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
isExit = false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
exit();
return false;
}
return super.onKeyDown(keyCode, event);
}
private void exit() {
if (!isExit) {
isExit = true;
Toast.makeText(getApplicationContext(), "再按一次退出程序",
Toast.LENGTH_SHORT).show();
// 利用handler延迟发送更改状态信息
mHandler.sendEmptyMessageDelayed(0, 2000);
} else {
finish();
System.exit(0);
}
}
2.2第二种实现方式,通过记录按键时间计算时间差实现:
private long exitTime = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
exit();
return false;
}
return super.onKeyDown(keyCode, event);
}
public void exit() {
if ((System.currentTimeMillis() - exitTime) > 2000) {
Toast.makeText(getApplicationContext(), "再按一次退出程序",
Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
finish();
System.exit(0);
}
详情请看原文地址
三:android之针对fragment多次调用onCreateView
View main;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (null != main) {
ViewGroup parent = (ViewGroup) main.getParent();
if (null != parent) {
parent.removeView(main);
}
} else {
main = inflater.inflate(R.layout.fragment_myinfo, null);
}
return main;
}
四:输入法弹出后,不影响activity原有布局
android:windowSoftInputMode = "adjustNothing|stateHidden"
activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。
这个属性能影响两件事情:
【A】当有焦点产生时,软键盘是隐藏还是显示
【B】是否减少活动主窗口大小以便腾出空间放软键盘
在AndroidManifest.xml文件中的activity中设置
android:windowSoftInputMode属性
<activity android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"] …… >
</activity>
各值的含义:
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
五:将Dialog设置为点击不能取消
1:dialog.setCanceledOnTouchOutside(false);// 设置点击屏幕Dialog不消失
2:在oncreate()方法中设置Dialog不可取消,实例代码如下:
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
this.setCancelable(false);// 设置Dialog不消失
int style = DialogFragment.STYLE_NORMAL, theme = 0;
setStyle(style,theme);
}
六:Android studio中不兼容.9图片
只需要在build文件中添加如下代码
android {
...
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
...
}
七:TextView文字长度限制,超过8个显示……
<TextView
android:id="@+id/notice_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxEms="8"
android:singleLine="true"
android:textColor="#333333" />
其中width要设置为wrap_content
八:禁用viewPager的触摸滑动事件
在项目中实现轮播的时候,往往有当图片只有一张的时候,viewpager不可以滑动,但是可以点击的需求。我们知道dispatchTouchEvent()这是屏幕触摸事件的分发器,他的返回值是boolean类型,如果他的返回值是true,那么说明本次触摸事件被消费掉了,会传进来一个新的触摸事件。如果是false,那么说明没有被消费掉,就不会换入一个新的事件。
其实不管是那一层,只要返回值改成true,就都不会执行触摸事件了。
onTouchEvent();onIntercepTouchEnent();onTouchEventListener里面的onTouch方法,这里面的返回值改成true三个都可以解决这个问题。
/**
* 用户触摸时不滚动
*/
@Override
public boolean onTouchEvent(MotionEvent arg0) {
if (count==1) {
return false;
}
int action = arg0.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN:
stopRolling();
break;
case MotionEvent.ACTION_MOVE:
stopRolling();
break;
case MotionEvent.ACTION_UP:
if (count>1) {
startRolling(ROLLING_DELAY);
}
break;
case MotionEvent.ACTION_CANCEL:
if (count>1) {
startRolling(ROLLING_DELAY);
}
break;
}
return super.onTouchEvent(arg0);
}
@Override
public boolean onInterceptTouchEvent(MotionEventarg0)
{
return false;
}