点击item,弹出信息,在listview里加一个listener,然后intent跳转
要显示的view是什么样,是要和服务器端开发人员沟通,这里直接把json解析,具体的新闻里有个地址,输入到浏览器,不过这里不能是10.0.2.2了,那是模拟器找本机的地址,在浏览器里输入localhost就好,可以看到一个完整的新闻页
调整字体大小
private void showChooseDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
String[] items = new String[] { "超大号字体", "大号字体", "正常字体", "小号字体",
"超小号字体" };
builder.setTitle("字体设置");
builder.setSingleChoiceItems(items, mCurrentItem,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.out.println("选中:" + which);
mCurrentChooseItem = which;
}
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
WebSettings settings = mWebView.getSettings();
switch (mCurrentChooseItem) {
case 0:
settings.setTextSize(TextSize.LARGEST);
break;
case 1:
settings.setTextSize(TextSize.LARGER);
break;
case 2:
settings.setTextSize(TextSize.NORMAL);
break;
case 3:
settings.setTextSize(TextSize.SMALLER);
break;
case 4:
settings.setTextSize(TextSize.SMALLEST);
break;
default:
break;
}
mCurrentItem = mCurrentChooseItem;
}
});
builder.setNegativeButton("取消", null);
builder.show();
}
分享功能,各家都有Android sdk,一家一家来太麻烦,找集成sharesdk平台,比如友盟、mob等
布局里加一个imagebutton
mob上需要注册 输入应用名字并获取key,然后下载解压,双击QuickIntegrater启动,填名称和manifest里的包名,然后确定
将workspace里的文件备份,再将生成的文件复制进去,把很多库拷进来了
F5刷新,manifest里权限、activity信息、assets下XML里的信息(页面里生成的key拷过来)
复制代码,导包
然后这里setNotification废弃了,却没有说明
public class NewsDetialActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
private void showShare(){
ShareSDK.initSDK(this);//这里是此activity的上下文,不是导包
OnekeyShare oks = new OnekeyShare();
/*// 分享时Notification的图标和文字
oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));*/
oks.setText("我是分享文本");
oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/05/21/oESpJ78_533x800.jpg");
// 启动分享GUI
oks.show(this);
}
}
还有在manifest里添加activity的声明,官网上的文档有老有新,注意区分。
<!-- For SHareSDK -->
<activity
android:name="com.mob.tools.MobUIShell"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode="stateHidden|adjustResize" >
<intent-filter>
<data android:scheme="tencent100371282" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
注意,点过的新闻变成灰色,每一个新闻都有一个ID,需要sharedperence,无需给每一个新闻弄一个字段,新闻loading的时候判断一下就好,然后点击后马上变色
首先是refreshlistview的adapter里要改动,这个adapter在TabDetailPager类里
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View item_view =null;
Holder holder = new Holder();
if (convertView==null) {
item_view = View .inflate(mActivity, R.layout.list_news_item, null);
holder.iv_newpic = (ImageView) item_view.findViewById(R.id.iv_pic);
holder.tv_newsitme_title = (TextView) item_view.findViewById(R.id.tv_newsitme_title);
holder.tv_newsitme_date = (TextView) item_view.findViewById(R.id.tv_newsitme_date);
item_view.setTag(holder);
}else {
item_view=convertView;
holder = (Holder) item_view.getTag();
}
holder.tv_newsitme_title.setText(listnewsData.get(position).title);
holder.tv_newsitme_date.setText(listnewsData.get(position).pubdate);
//点击时要判断一下,点击过的要变色
TabNewsData item = (TabNewsData) getItem(position);
String ids = PrefUtils.getString(mActivity, "read_ids", "");
if (ids.contains(item.id)) {
holder.tv_newsitme_title.setTextColor(Color.GRAY);
} else {
holder.tv_newsitme_title.setTextColor(Color.BLACK);
}
bitmapUtils.display(holder.iv_newpic, listnewsData.get(position).listimage);
return item_view;
}
}
然后点击时也要变
lv_tab_detail_news.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
String title= mTabDetailData.data.news.get(position-2).title;
System.out
.println("TabDetailPager onItemClick()"+position+"/"+title);
String readid= mTabDetailData.data.news.get(position-2).id;
String ids = PrefUtils.getString(mActivity, "read_ids", "");
if (!ids.contains(readid)) {
ids = ids + readid + ",";
PrefUtils.setString(mActivity, "read_ids", ids );
}
changeReadState(view);
//跳入到新闻页面:
Intent intent = new Intent(mActivity, NewsDetialActivity.class);
intent.putExtra("url", mTabDetailData.data.news.get(position-2).url);
mActivity.startActivity(intent);
}
});
//返回整个listview
return v;
}
private void changeReadState(View view) {
TextView tv_newsitme_title = (TextView) view.findViewById(R.id.tv_newsitme_title);
tv_newsitme_title.setTextColor(Color.GRAY);
}
完成activity
public class NewsDetialActivity extends Activity implements OnClickListener{
private WebView mWebView;
private ImageButton btnBack;
private ImageButton btnSize;
private ImageButton btnShare;
private ProgressBar pbProgress;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_news_detail);
mWebView = (WebView) findViewById(R.id.wv_web);
btnBack = (ImageButton) findViewById(R.id.btn_back);
btnSize = (ImageButton) findViewById(R.id.btn_size);
btnShare = (ImageButton) findViewById(R.id.btn_share);
btnBack.setOnClickListener(this);
btnSize.setOnClickListener(this);
btnShare.setOnClickListener(this);
pbProgress = (ProgressBar) findViewById(R.id.pb_progress);
String url = getIntent().getStringExtra("url");
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true); //支持js
settings.setBuiltInZoomControls(true);//显示放大缩小按钮
settings.setUseWideViewPort(true);// 支持双击缩放
mWebView.setWebViewClient(new WebViewClient() {
/**
*网页开始加载
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
super.onPageStarted(view, url, favicon);
System.out.println("网页开始加载");
pbProgress.setVisibility(View.VISIBLE);
}
/**
*网页加载结束
*/
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
System.out.println("网页加载结束");
pbProgress.setVisibility(View.GONE);
}
/**
* 所有跳转的链接都会在此方法中回调
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// tel:110
System.out.println("跳转url:" + url);
view.loadUrl(url);
return true;
// return super.shouldOverrideUrlLoading(view, url);
}
});
mWebView.loadUrl(url);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn_back:
finish();
break;
case R.id.btn_size:
showChooseDialog();
break;
case R.id.btn_share:
showShare();
break;
default:
break;
}
}
private int mCurrentChooseItem;// 记录当前选中的item, 点击确定前
private int mCurrentItem = 2;//记录当前选中的item, 点击确定后
/**
* 设置字体
*/
private void showChooseDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
String[] items = new String[] { "超大号字体", "大号字体", "正常字体", "小号字体",
"超小号字体" };
builder.setTitle("字体设置");
builder.setSingleChoiceItems(items, mCurrentItem,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.out.println("选中:" + which);
mCurrentChooseItem = which;
}
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
WebSettings settings = mWebView.getSettings();
switch (mCurrentChooseItem) {
case 0:
settings.setTextSize(TextSize.LARGEST);
break;
case 1:
settings.setTextSize(TextSize.LARGER);
break;
case 2:
settings.setTextSize(TextSize.NORMAL);
break;
case 3:
settings.setTextSize(TextSize.SMALLER);
break;
case 4:
settings.setTextSize(TextSize.SMALLEST);
break;
default:
break;
}
mCurrentItem = mCurrentChooseItem;
}
});
builder.setNegativeButton("取消", null);
builder.show();
}
private void showShare(){
ShareSDK.initSDK(this);//这里是此activity的上下文,不是导包
OnekeyShare oks = new OnekeyShare();
/*// 分享时Notification的图标和文字
oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));*/
oks.setText("我是分享文本");
oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/05/21/oESpJ78_533x800.jpg");
// 启动分享GUI
oks.show(this);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/title_red_bg" >
<ImageButton
android:id="@+id/btn_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:background="@null"
android:src="@drawable/back" />
<ImageButton
android:id="@+id/btn_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:background="@null"
android:src="@drawable/icon_share" />
<ImageButton
android:id="@+id/btn_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:layout_toLeftOf="@id/btn_share"
android:background="@null"
android:src="@drawable/icon_textsize" />
</RelativeLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<WebView
android:id="@+id/wv_web"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ProgressBar
android:id="@+id/pb_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminateDrawable="@drawable/custom_progress" />
</FrameLayout>
</LinearLayout>
pref工具里面加上
public static String getString(Context ctx, String key,
String defaultValue) {
SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,
Context.MODE_PRIVATE);
return sp.getString(key, defaultValue);
}
public static void setString(Context ctx, String key, String value) {
SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,
Context.MODE_PRIVATE);
sp.edit().putString(key, value).commit();
}
分享页面全屏,这要在show里面改
private void showShare(){
ShareSDK.initSDK(this);//这里是此activity的上下文,不是导包
OnekeyShare oks = new OnekeyShare();
/*// 分享时Notification的图标和文字
oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));*/
oks.setText("我是分享文本");
oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/05/21/oESpJ78_533x800.jpg");
oks.setTheme(OnekeyShareTheme.SKYBLUE);//全屏蓝底
// 启动分享GUI
oks.show(this);
}
在分享的时候,如果要显示来自。。。。的分享,需要在对应的sdk平台注册开发者账号,并拿到key,在sdk.xml里添上相应代码,这样分享基本搞定
集成这个sdk后会有乱码的可能
一般都是utf-8的编码,如果当初创建的是本地编码,集成的sdk里会报错,为了不报错,这里可以更改本APP的编码,但是此时就会有一些乱码什么的
要么就是在sdk里改,要么在自己的代码里改,很多是无法识别的字符 成了空格什么的,把不识别的代码和注释里的汉字弄到一块了,换一行可能正常了
组图功能的实现
需要一个layout,listview实现大图的填充,需要解析json,然后到底加载什么的都一样
bean里格式化
public class PhotosData {
public int retcode;
public PhotosInfo data;
public class PhotosInfo {
public String title;
public ArrayList<PhotoInfo> news;
}
public class PhotoInfo {
public String id;
public String listimage;
public String pubdate;
public String title;
public String type;
public String url;
}
}
global里定义URL
public class GlobalContants {
//public static final String SERVER_URL = "http://192.168.1.105:8080/java";
public static final String SERVER_URL = "http://10.0.2.2:8080/zhbj";
public static final String CATEGORIES_URL = SERVER_URL + "/categories.json";
public static final String PHOTOS_URL = SERVER_URL+"/photos/photos_1.json";// 获取组图信息的接口
}
完成photo
public class PhotoMenuDetailPager extends BaseMenuDetailPager {
private ListView lvPhoto;
private GridView gvPhoto;
private ArrayList<PhotoInfo> mPhotoList;
private PhotoAdapter mAdapter;
private ImageButton btnPhoto;
public PhotoMenuDetailPager(Activity activity) {
super(activity);
}
public PhotoMenuDetailPager(Activity activity, ImageButton btnPhoto) {
super(activity);
this.btnPhoto = btnPhoto;
btnPhoto.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
changeDisplay();
}
});
}
@Override
public View initViews() {
View view = View.inflate(mActivity, R.layout.menu_photo_pager, null);
lvPhoto = (ListView) view.findViewById(R.id.lv_photo);
gvPhoto = (GridView) view.findViewById(R.id.gv_photo);
return view;
}
@Override
public void initData() {
getDataFromServer();
}
private void getDataFromServer() {
HttpUtils utils = new HttpUtils();
utils.send(HttpMethod.GET, GlobalContants.PHOTOS_URL,
new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
String result = (String) responseInfo.result;
parseData(result);
}
@Override
public void onFailure(HttpException error, String msg) {
Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT)
.show();
error.printStackTrace();
}
});
}
protected void parseData(String result) {
Gson gson = new Gson();
PhotosData data = gson.fromJson(result, PhotosData.class);
mPhotoList = data.data.news;// 获取组图列表集合
if (mPhotoList != null) {
mAdapter = new PhotoAdapter();
lvPhoto.setAdapter(mAdapter);
gvPhoto.setAdapter(mAdapter);
}
}
class PhotoAdapter extends BaseAdapter {
private BitmapUtils utils;
public PhotoAdapter() {
utils = new BitmapUtils(mActivity);
utils.configDefaultLoadingImage(R.drawable.news_pic_default);
}
@Override
public int getCount() {
return mPhotoList.size();
}
@Override
public PhotoInfo getItem(int position) {
return mPhotoList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(mActivity, R.layout.list_photo_item,
null);
holder = new ViewHolder();
holder.tvTitle = (TextView) convertView
.findViewById(R.id.tv_title);
holder.ivPic = (ImageView) convertView
.findViewById(R.id.iv_pic);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
PhotoInfo item = getItem(position);
holder.tvTitle.setText(item.title);
utils.display(holder.ivPic, item.listimage);
return convertView;
}
}
static class ViewHolder {
public TextView tvTitle;
public ImageView ivPic;
}
private boolean isListDisplay = true;// 是否是列表展示
/**
* 切换展现方式
*/
private void changeDisplay() {
if (isListDisplay) {
isListDisplay = false;
lvPhoto.setVisibility(View.GONE);
gvPhoto.setVisibility(View.VISIBLE);
btnPhoto.setImageResource(R.drawable.icon_pic_list_type);
} else {
isListDisplay = true;
lvPhoto.setVisibility(View.VISIBLE);
gvPhoto.setVisibility(View.GONE);
btnPhoto.setImageResource(R.drawable.icon_pic_grid_type);
}
}
}
列图模式,gridview,然后点button,两种模式来回切,毫无卡顿感,实际上使用帧布局,把listview和gridview放在一块了,隐藏其中一个
需要在basepager里找到button
public void initViews() {
mRootView = View.inflate(mActivity,R.layout.base_pager, null);
tvTitle = (TextView) mRootView.findViewById(R.id.tv_title);
flContent = (FrameLayout) mRootView.findViewById(R.id.fl_content);
//组图切换
btnPhoto = (ImageButton) mRootView.findViewById(R.id.btn_photo);
布局里加上button
<ImageButton
android:id="@+id/btn_photo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:background="@null"
android:src="@drawable/icon_pic_grid_type"
android:visibility="gone" />
newsCenterPager实现模式的切换
public void setCurrentMenuDetailPager(int position) {
//在这个pager里面的flcontent(帧布局)里面增加一个布局
BaseMenuDetailPager baseMenuDetailPager = mPagers.get(position);
flContent.removeAllViews();// 清除之前的布局
flContent.addView( baseMenuDetailPager.mRootView);
baseMenuDetailPager.initData();// 初始化当前页面的数据
//两种模式的切换
if (baseMenuDetailPager instanceof PhotoMenuDetailPager) {
btnPhoto.setVisibility(View.VISIBLE);
} else {
btnPhoto.setVisibility(View.GONE);
}
布局里加上一个grid,和list并存
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/lv_photo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="#fff"
android:divider="@null" />
<GridView
android:id="@+id/gv_photo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="2"
android:visibility="gone" />
</FrameLayout>
list
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="@drawable/pic_list_item_bg"
android:gravity="center"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv_pic"
android:layout_width="match_parent"
android:layout_height="180dp"
android:scaleType="centerCrop"
android:src="@drawable/news_pic_default" />
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="标题"
android:singleLine="true"
android:textColor="#000"
android:textSize="22sp" />
</LinearLayout>
</LinearLayout>
jpush
注册APP
集成
备份,导入jar包
将armeabi这个包含底层库的包复制进lib,还有一个armeabi-v7a同样
manifest配置
注意,其中需要手动修改的地方,包括key
写一个继承application的类,其中是一些初始化的内容,拷进来的,application里的oncreate比activity例的先执行,需要去manifest里声明
这样子就基本绑定了
客户端sdk
message是由消息显示,注册一个receiver,可以带上一个URL,这样子,可以点击通知栏的信息后跳转出来,交给一个activity,显示详细信息什么的,大概就这样
public class MyReceiver extends BroadcastReceiver {
private static final String TAG = "JPush";
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Log.d(TAG, "[MyReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));
if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
Log.d(TAG, "[MyReceiver] 接收Registration Id : " + regId);
//send the Registration Id to your server...
} else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
Log.d(TAG, "[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));
} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
Log.d(TAG, "[MyReceiver] 接收到推送下来的通知");
int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
Log.d(TAG, "[MyReceiver] 接收到推送下来的通知的ID: " + notifactionId);
} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
Log.d(TAG, "[MyReceiver] 用户点击打开了通知");
} else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
Log.d(TAG, "[MyReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
//在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等..
} else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
Log.w(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected);
} else {
Log.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());
}
}
另一种通知,不在用户界面上通知,比如微信,不主动push消息,但是每当你进去后,如果有留言、赞什么的,就已经初始化好了,这就是后台有一个service,接到push来的消息,直接在后台初始化了,用户就能进去看到
服务器端页游sdk,在有大量信息push的时候,比较省事,不用自己去手动一条一条的添加
适配:
图片适配
一套图多准备几种分辨率的,会自动适配不同分辨率的机子
drawable-ldpi 240*320
drawable-mdip 320*480
drawable-hdpi 480*800
drawable-xhdpi 1280*720
drawable-xxhdpi 1920*1280
系统找图的原则是:优先向上找图,如果上面所有的分辨率都没有找到,再往下找
但是:不常用。
原因是? 图片切很多套很占空间。而且增加美工的工作量。
布局适配
在不同分辨率的手机上,去找对应分辨率下面的布局文件。根据该布局文件去绘制页面。
建立多个布局文件,乘号是x而不是*,另外哪个大哪个在前,而不是规定宽在前或者高在前
效果不太好,低分辨率的比较稀疏,高分辨率很密集,否则就容易出现高分辨率的很空旷,低分辨率的屏幕被占满
尺寸适配
dp= px / 屏幕密度
drawable-ldpi 240*320 屏幕密度 0.75 //120pix ---> 160dp *0.75 =120 px
drawable-mdip 320*480 屏幕密度 1.0 dp=px
drawable-hdpi 480*800 屏幕密度 1.5 //240pix ---》 160dp *1.5 = 240px
getsource().getDisplayMetries().density可获取密度
trise
权重适配
layout_weight非常好用,写一个weightSum=3 剩下两个空间都写1,则各占三分之一
代码适配
int height = getWindowManager().getDefaultDisplay().getHeight();
int width = getWindowManager().getDefaultDisplay().getWidth();
TextView tv1 = (TextView) findViewById(R.id.tv1);
TextView tv2 = (TextView) findViewById(R.id.tv2);
LayoutParams params = new LayoutParams(width/2, LayoutParams.WRAP_CONTENT);
tv1.setLayoutParams(params);
tv2.setLayoutParams(params);
之前在splash里的小灰点写的像素值
可以写一个工具类,将像素转成dp
public static int Dp2Pix(Context ctx, int dp){
int px=0;
float density = ctx.getResources().getDisplayMetrics().density;
px= (int ) (dp*density+0.5f); // 4.9 -->4 4.4->4
return px;
}
另外有一个问题,在不同分辨率的机子上,侧边栏的button什么的大小不合适
main里面应该是计算得到,之前写死了
private void initSlidingMenu() {
// 第一步(2) 找到侧边栏
setBehindContentView(R.layout.activity_behind);
//第一步(3) get一个SlidingMenu实例
SlidingMenu menu = getSlidingMenu();
//第一步(4) set出触摸方式和边距,都是必须
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
menu.setBehindOffset(220);//这里应该通过计算得到
}