Dialog进入效果/列出已安装应用/用CheckBox做单选/listview优化
Posted 小喽啰A
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dialog进入效果/列出已安装应用/用CheckBox做单选/listview优化相关的知识,希望对你有一定的参考价值。
今天领导让做个关联应用的功能。大致就是在本地保存一个服务端id到本地客户端的映射,需要客户手动完成这个映射关系。由于一些细节感觉是自己没有注意到的,所以做个记录,也为分享给同样没有注意到这写东西的朋友。
首先,是给Dialog设置出入动画效果,用的是style+anim,以前这中方式我从来没有用过,只会用startAnim...,发现这个又一次赶脚真的比较菜。
设置代码是这样的:
//dialog是我自己定义好的
Window window = dialog.getWindow();
window.setGravity(Gravity.BOTTOM);
window.setWindowAnimations(R.style.mystyle);
dialog.show();
既然这个方法是通过Window对象来实现的,我想其他拥有Window对象的界面也应该都可以用同样的方式实现出入动画,或者其他的效果把。我目前还没有试,改天试试再说。
还有,R.style.mystyle是这样定义的:
<style name="mystyle" parent="android:Animation">
<item name="@android:windowEnterAnimation">@anim/dialog_enter</item>
<item name="@android:windowExitAnimation">@anim/dialog_exit</item>
</style>
dialog_enter的定义:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="600"
android:fromYDelta="100%p" />
</set>
dialog_exit的定义:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="600"
android:toYDelta="100%p" />
</set>
然后是列出手机上安装的所有应用,虽然一直知道这个东西该怎么弄,但以前一直没动手做个,这里也记录下把,下次用到的时候直接COPY哈~
List<PackageInfo> packages = getPackageManager().getInstalledPackages(0);
ArrayList<PackageInfo> appList = new ArrayList<PackageInfo>();
for (int i = 0; i < packages.size(); i++)
if ((packages.get(i).applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
appList.add(packages.get(i));
packages.get(i).applicationInfo.loadIcon(getPackageManager());
上面代码中appList集合中是非系统应用,packages集合中是所有的应用,如果需要用到系统应用,只需要将if判断改成==1就行。
另外我还遇到个问题,是我在做应用列表的时候,我打算是用CheckBox放在每个条目的后面,但我想做成单选的效果。
问题是当我的dialog显示的时候我HOME退出再回来,上次选择的那一项仍然处于选中状态,而且我选择其他项的时候不会取消选中状态。
我想的是在activity onPause()的时候把dialog dismiss掉,或者cancel掉,但都不可以,我把dialog置为null的时候程序还会跪。。。
下面是我程序的代码,哪位大神知道怎么修改这个bug,请告诉我,小弟不胜感激:
package com.example.appconfigdemo;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity
private Button btn;
ArrayList<PackageInfo> appList = new ArrayList<PackageInfo>();
private int selected = -1;
private CheckBox currBox;
private AlertDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
List<PackageInfo> packages = getPackageManager()
.getInstalledPackages(0);
for (int i = 0; i < packages.size(); i++)
if ((packages.get(i).applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
appList.add(packages.get(i));
packages.get(i).applicationInfo.loadIcon(getPackageManager());
btn.setOnClickListener(new OnClickListener()
class ViewHolder
ImageView icon;
TextView title;
TextView version;
CheckBox isSelected;
@Override
public void onClick(View v)
View view = View.inflate(MainActivity.this,
R.layout.dialog_bindapp_list, null);
dialog = new AlertDialog.Builder(MainActivity.this)
.setView(view).setTitle("非系统应用").create();
ListView lv = (ListView) view.findViewById(R.id.lv);
lv.setAdapter(new BaseAdapter()
@Override
public View getView(int arg0, View arg1, ViewGroup arg2)
PackageInfo pi = appList.get(arg0);
View v = null;
ImageView icon = null;
TextView title = null;
TextView version = null;
CheckBox isSelected = null;
if (arg1 == null)
v = View.inflate(MainActivity.this,
R.layout.dialog_bindapp_item, null);
icon = (ImageView) v.findViewById(R.id.icon);
title = (TextView) v.findViewById(R.id.title);
version = (TextView) v.findViewById(R.id.version);
isSelected = (CheckBox) v
.findViewById(R.id.selected);
ViewHolder holder = new ViewHolder();
holder.icon = icon;
holder.title = title;
holder.version = version;
holder.isSelected = isSelected;
v.setTag(holder);
else
v = arg1;
ViewHolder holder = (ViewHolder) v.getTag();
icon = holder.icon;
title = holder.title;
version = holder.version;
isSelected = holder.isSelected;
icon.setImageDrawable(pi.applicationInfo
.loadIcon(getPackageManager()));
title.setText(pi.applicationInfo.loadLabel(
getPackageManager()).toString());
version.setText("版本:" + pi.versionName);
if (arg0 == selected)
isSelected.setChecked(true);
else
isSelected.setChecked(false);
return v;
@Override
public long getItemId(int arg0)
return arg0;
@Override
public Object getItem(int arg0)
return appList.get(arg0);
@Override
public int getCount()
return appList.size();
);
lv.setOnItemClickListener(new OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3)
ViewHolder holder = (ViewHolder) arg1.getTag();
if (!holder.isSelected.isChecked())
if (currBox != null && currBox.isChecked())
currBox.setChecked(false);
holder.isSelected.setChecked(true);
selected = arg2;
currBox = holder.isSelected;
else
holder.isSelected.setChecked(false);
selected = -1;
);
Window window = dialog.getWindow();
window.setGravity(Gravity.BOTTOM);
window.setWindowAnimations(R.style.mystyle);
dialog.show();
);
@Override
protected void onPause()
super.onPause();
另外,我在做listView 优化的时候,找到篇写的很好的文章,这里分享出来。
其实我感觉主要还是对图片和内存的处理,但我还没有实际经验,就不乱说了。
以上是关于Dialog进入效果/列出已安装应用/用CheckBox做单选/listview优化的主要内容,如果未能解决你的问题,请参考以下文章