2015/7/31/
项目中的 背景,能用Shape 画得,就不要用图片。
2015/8/3
Handler 的标准写法, 要做成静态。
private static class MyHandler extends Handler {
private final WeakReference<MainActivity> mActivity;
public MyHandler(MainActivity activity) {
mActivity = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
MainActivity activity = mActivity.get();
if (activity == null) {
return;
}
activity.handleMsg(msg);
}
}
------------------------------------------------------------------------------
2015/8/4
今天项目中遇到一个问题, 在一个Activity 中 有两个Fragment, 这两个fragment 的 OnActivityResult 方法,会被父类 拦截。如果要再Fragment 中的OnActivityResult 方法中处理,就需要在Activity 的OnActivityResult 方法中进行判断,然后传递进去。
Activity 中进行如下处理,就可以传递到 fragment 中
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Fragment f = fragmentManager.findFragmentByTag(curFragmentTag);
f.onActivityResult(requestCode, resultCode, data);
}
具体需求就是 两个Fragment 中都要进行选择图片,上传,选择以后 OnActivityResult 方法 被Activity 拦截。
-----------------------------------------------------------------------------------------------------------------------------
2015/8/6
布局中设置 android:οnclick=""; 在Fragment 中不可以使用, 只能在Activity 中使用!
2015/8/10
header_gridview.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int[] position = new int[2];
name.getLocationOnScreen(position);
if( position[1]<=titleHeight*2){
setTitle("作者姓名");
}else{
setTitle("作者介绍页面");
}
}
});
一个HeadGridview 添加一个 布局 头, 然后滑动 计算 头布局中 view 的位置 用 getTop 方法 得到的永远是刚初始化后 距离屏幕顶部的距离,或者说距离Activity顶部的距离。 即使 头布局已经滑动出去不可见了,用 getvisibility 也是 0 (可见)。 但是用 view.getLocationOnXX() 方法 可以获取到 实际位置,如果滑动出屏幕 获取的Y值为负值。达到 -295 好像就是最大,即使在滑动 也不会增加。
-----------------------------------------------------------------------------------------------------------------------------
2015/8/13
吐司 背景透明
public class AppToast {
/** 弹窗类型:(如加入书签等) */
public static enum TOAST_T {
/*** 添加书签成功 */
ADD_BOOKMARK_SUCCES,
/** 锁屏 */
ADD_LOCKSCREEN_SUCCES
}
public static void show(TOAST_T type, Context context, int duration) {
Toast toast = new Toast(context);
switch (type) {
case ADD_BOOKMARK_SUCCES:
case ADD_LOCKSCREEN_SUCCES:
toast.setView(generateToast(context, type));
break;
default:
break;
}
toast.setDuration(duration);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
public static View generateToast(Context context, TOAST_T type) {
return generateToast(context, 350, 260, type, R.id.id01, R.drawable.img_share_qq_ricon, R.string.cartoon_instr_check_mark);
}
/**
*
* @param context
* : 上下文对象
* @param width
* : Toast 的宽度 px
* @param height
* : 吐司 的 高度
* @param type
* : 类型
* @param picid
* : 给 图片设置的 id
* @param picresid
* : Imageview 的 资源 id
* @param botoomtextresid
* : 底部文字 的 资源 id.
* @return
*/
private static View generateToast(Context context, int width, int height, TOAST_T type, int picid, int picresid, int botoomtextresid) {
RelativeLayout parentView = new RelativeLayout(context);
RelativeLayout.LayoutParams mParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
parentView.setLayoutParams(mParams);
// toast 设置背景
RelativeLayout childView = new RelativeLayout(context);
childView.setBackgroundResource(R.drawable.shape_toast_bg_tanslucent);
RelativeLayout.LayoutParams mChildParams = new RelativeLayout.LayoutParams(width, height);
mChildParams.addRule(RelativeLayout.CENTER_VERTICAL);
childView.setLayoutParams(mChildParams);
// 是否添加文字。
switch (type) {
case ADD_BOOKMARK_SUCCES:
// 添加底部 已经加入书单文字
TextView bottomText = new TextView(context);
bottomText.setText(botoomtextresid);
// mWatchCartoonTextView.setTextColor(android.R.color.white);
RelativeLayout.LayoutParams mTextViewParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
mTextViewParams.addRule(RelativeLayout.CENTER_IN_PARENT);
mTextViewParams.addRule(RelativeLayout.BELOW, picid);
mTextViewParams.setMargins(0,DemiUitls.dip2px(context, 5), 0, 0);
childView.addView(bottomText, mTextViewParams);
break;
case ADD_LOCKSCREEN_SUCCES:// 锁屏 更换 图片
picresid=R.drawable.img_share_friend_circle;
default:
break;
}
// 添加 图片资源
ImageView imageView = new ImageView(context);
imageView.setId(picid);
imageView.setBackgroundResource(picresid);
RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
imageParams.addRule(RelativeLayout.CENTER_IN_PARENT);
childView.addView(imageView, imageParams);
parentView.addView(childView);
return parentView;
}
}
背景 :
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android">
<corners
android:radius="6dp"
/>
<padding
android:left="5dp"
android:top="5dp"
android:right="5dp"
android:bottom="5dp"
/>
<solid
android:color="#b0000000"
/>
</shape>
PS: 嵌套一层保平安-----------代码生成的布局 嵌套了一层 relativelayout。 如果用layout 布局写 也一定要嵌套一层, 否则 toast 大小只会按照包裹的 实际大小显示,无法按你自己想要的大小显示。
-----------------------------------------------------------------------------------------------------------------------------
2015/8/14
scrollview 滑动, 渐显 渐 隐 标题栏
这是 从 一款 ios app 上看到的,就是 讲标题栏 设置一下 透明。 随着 向上滑动 而 逐渐 显现 ,向下滑动逐渐隐藏
mTitleLayout.getBackground().setAlpha();
给一个 标题,默认隐藏 ,或者 透明,然后 逐渐 改变 一下透明度
void android.graphics.drawable.Drawable.setAlpha(int alpha)
Specify an alpha value for the drawable. 0 means fully transparent, and 255 means fully opaque
范围 0-255.
如果 滑动的 view 有 setOnScrollListener 事件,那么只要 获取一下onscroll 方法 中返回的 宽高,即可 根据 宽高 设置透明度。
如果是 ScrollView,本身没有 setOnScrollListener 那么就需要自己去 创建一个类似的方法
package com.dmzj.manhua.views;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;
/**
* 带有 scrolllistener 的 scrollview ,默认 scrollview 没有 scrolllistener
*
* @author jorge
*
*/
public class CommonScrollView extends ScrollView {
private ScrollViewListener scrollViewListener = null;
public interface ScrollViewListener {
void onScrollChanged(int left, int top, int oldleft, int oldtop);
}
public CommonScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public CommonScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public CommonScrollView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public void setScrollViewListener(ScrollViewListener scrollViewListener) {
this.scrollViewListener = scrollViewListener;
}
@Override
protected void onScrollChanged(int left, int top, int oldleft, int oldtop) {
super.onScrollChanged(left, top, oldleft, oldtop);
if(scrollViewListener!=null){
scrollViewListener.onScrollChanged(left, top, oldleft, oldtop);
}
}
}
如onScrollChanged 方法 是 Protected 那么 我们就根据这个方法 把 返回值 传递出去。
-----------------------------------------------------------------------------------------------------------------------------
2015/8/17
项目中通用的 弹窗
package com.dmzj.manhua.views;
import android.app.Activity;
import android.os.Handler;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.dmzj.manhua.R;
import com.dmzj.manhua.utils.DemiUitls;
/**
* 通用的弹窗 (eg:漫画订阅弹窗,浏览记录弹窗)
* 用法:
* 1. CommonDialog diaolg=new CommonDialog 初始化
* 2. diaolg.showDialog() 展示 具体 展示内容 在 generateLayout()方法 的 switch 中 根据DIALOG_TYPE 添加
* 3. mHandler.sendEmptyMessage(itemid); 每一条的 点击事件 到 具体调用界面 , what 为 该条目布局 RelativeLayout 设置的 id。
* @author jorge
*
*/
public class CommonDialog extends BaseDialog {
/*** 排行类型 **/
public static enum DIALOG_TYPE {
DIALOG_CARTOON_SUBSCRIBE, // 漫画订阅 弹窗
DIALOG_BROWSE_HISTORY, // 浏览历史 弹窗
}
private Activity mActivity;
private Handler mHandler;
/**
* 不自定义 样式
* @param context : 上下文对象
* @param handler :Handler 对象
* @param type :弹窗的类型
*/
public CommonDialog(Activity context, Handler handler, DIALOG_TYPE type) {
super(context);
this.mHandler = handler;
mActivity = context;
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.setContentView(generateLayout(type));
}
/**
* 带有dialog theme
* @param context : 上下文对象
* @param theme : style
* @param inflater:Handler 对象
* @param type :弹窗的类型
*/
public CommonDialog(Activity context, int theme, Handler handler, DIALOG_TYPE type) {
super(context, theme);
this.mHandler = handler;
mActivity = context;
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.setContentView(generateLayout(type));
// setlistener();
}
/**
* 展示 弹窗 , 具体 出现的位置 窗体 居中。
*/
@Override
public void showDialog() { // 展示位置
super.showDialog();
Window window = this.getWindow();
window.setGravity(Gravity.CENTER);
this.setCanceledOnTouchOutside(false);
window.setLayout(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
// window.setLayout(mActivity.getWindowManager().getDefaultDisplay().getWidth(),
// LayoutParams.WRAP_CONTENT);
}
/**
* @param textresid : 文字 在 String.xml 中的 资源id.
* @param lefticonid : 图标 的 资源id (eg: R.drawble.ic_launcher)
* @param itemid : 条目Relativelayout 的id , 用法 根据 id 去实现 每条的 点击事件
* @return
*/
public RelativeLayout generateItemLayot(int textresid, int lefticonid, final int itemid) {
// 左右边距
int magrin = (int) mActivity.getResources().getDimension(R.dimen.common_ui_horizontal_marg);
// 观看动漫
RelativeLayout mItemLayout = new RelativeLayout(mActivity);
mItemLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mHandler.sendEmptyMessage(itemid);
CommonDialog.this.dismiss();
}
});
mItemLayout.setId(itemid);
RelativeLayout.LayoutParams mItemParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, mActivity.getResources().getDimensionPixelSize(R.dimen.view_titlebar_hei));
mItemParams.addRule(RelativeLayout.CENTER_VERTICAL);
mItemLayout.setLayoutParams(mItemParams);
// 添加 左边图标
MyImageView mToggleButton = new MyImageView(mActivity);
mToggleButton.setId(lefticonid);
mToggleButton.setImageResource(lefticonid);
RelativeLayout.LayoutParams mToggleParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
mToggleParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
mToggleParams.addRule(RelativeLayout.CENTER_VERTICAL);
mToggleParams.setMargins(DemiUitls.dip2px(mActivity, magrin), 0, 0, 0);
mItemLayout.addView(mToggleButton, mToggleParams);
// 添加描述文字
TextView mWatchCartoonTextView = new TextView(mActivity);
mWatchCartoonTextView.setText(textresid);
mWatchCartoonTextView.setTextColor(R.color.comm_gray_high);
RelativeLayout.LayoutParams mTextViewParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
mTextViewParams.addRule(RelativeLayout.RIGHT_OF, lefticonid);
mTextViewParams.addRule(RelativeLayout.CENTER_VERTICAL);
mTextViewParams.setMargins(DemiUitls.dip2px(mActivity, magrin), 0, 0, 0);
mItemLayout.addView(mWatchCartoonTextView, mTextViewParams);
// 头部内容添加底部线
ImageView headerBottm = new ImageView(getActivity());
headerBottm.setBackgroundResource(R.drawable.common_divider_line_black);
RelativeLayout.LayoutParams headerBottmp = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
headerBottmp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
mItemLayout.addView(headerBottm, headerBottmp);
mItemLayout.setClickable(true);
mItemLayout.setBackgroundResource(R.drawable.selector_shape_white_gray_low_small);
return mItemLayout;
}
/**
* 生成 弹窗 body
* @param type 弹窗类型
* @return :view
*/
public LinearLayout generateLayout(DIALOG_TYPE type) {
LinearLayout mParentLayout = new LinearLayout(mActivity);
LinearLayout.LayoutParams mParentParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
mParentLayout.setLayoutParams(mParentParams);
mParentLayout.setBackgroundResource(R.drawable.shape_commdialog_bg_white);
// 标题栏
mParentLayout.setOrientation(LinearLayout.VERTICAL);
switch (type) {
case DIALOG_CARTOON_SUBSCRIBE:
mParentLayout.addView(generateItemLayot(R.string.cartoon_instr_start_read, R.drawable.img_icon_clock, R.id.id11)); // 看漫画
mParentLayout.addView(generateItemLayot(R.string.cartoon_instr_order, R.drawable.img_icon_clock, R.id.id12)); // 下载漫画
break;
case DIALOG_BROWSE_HISTORY:
mParentLayout.addView(generateItemLayot(R.string.txt_cartoon_dir, R.drawable.img_icon_clock, R.id.id13)); // 看小说
mParentLayout.addView(generateItemLayot(R.string.txt_direct_look, R.drawable.img_icon_clock, R.id.id13)); // 看小说
mParentLayout.addView(generateItemLayot(R.string.txt_delete_record, R.drawable.img_icon_clock, R.id.id13)); // 看小说
mParentLayout.addView(generateItemLayot(R.string.txt_all_cases, R.drawable.img_icon_clock, R.id.id13)); // 看小说
break;
default:
break;
}
return mParentLayout;
}
}
去除Dialog 的黑色背景 和 边框 添加 style
<style name="dialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">false</item>
<item name="android:windowNoTitle">true</item>
<item name="android:background">@null</item>
<item name="android:backgroundDimEnabled">false</item>
<item name="android:windowBackground"> @android:color/transparent </item>
</style>
-----------------------------------------------------------------------------------------------------------------------------
2015/8/18
getResources().getDimensionPixelSize
getResources().getDimension
都是 根据 资源 的 dp值与 手机 分辨率 转换成 Pixel 不同点 是 getDimensionPixelSize返回类型int, getDimension返回类型 float。
public static float applyDimension(int unit, float value,
DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}