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 优化的时候,找到篇写的很好的文章,这里分享出来。

ListView优化的文章

其实我感觉主要还是对图片和内存的处理,但我还没有实际经验,就不乱说了。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的 Android 应用程序,包含了您提到的所有功能: ```java public class MainActivity extends AppCompatActivity { private TextView textView; private EditText editText; private ImageView imageView; private Button button; private ImageButton imageButton; private RadioButton radioButton; private CheckBox checkBox; private ProgressBar progressBar; private ListView listView; private Menu menu; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 文本标签 textView = findViewById(R.id.text_view); // 编辑框 editText = findViewById(R.id.edit_text); // 图像 imageView = findViewById(R.id.image_view); // 提示框 Toast.makeText(this, "Hello World!", Toast.LENGTH_SHORT).show(); // 按钮 button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO: 按钮点击事件 } }); // 图像按钮 imageButton = findViewById(R.id.image_button); imageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO: 图像按钮点击事件 } }); // 单选按钮 radioButton = findViewById(R.id.radio_button); radioButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO: 单选按钮点击事件 } }); // 复选按钮 checkBox = findViewById(R.id.check_box); checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO: 复选按钮点击事件 } }); // 进度条 progressBar = findViewById(R.id.progress_bar); // 列表 listView = findViewById(R.id.list_view); // 菜单 getMenuInflater().inflate(R.menu.menu_main, menu); // 对话框 new AlertDialog.Builder(this) .setTitle("提示") .setMessage("确定要删除吗?") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO: 确定按钮点击事件 } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO: 取消按钮点击事件 } }) .create() .show(); // 图形 // TODO: 实现图形功能 // 动画 // TODO: 实现动画功能 // 音频(内部) MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.audio); mediaPlayer.start(); // 视频(内部) VideoView videoView = findViewById(R.id.video_view); videoView.setVideoPath("android.resource://" + getPackageName() + "/" + R.raw.video); videoView.start(); // 传感器 SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sensorManager.registerListener(new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { // TODO: 传感器数据处理 } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }, sensor, SensorManager.SENSOR_DELAY_NORMAL); // 通知 NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "channel_id") .setSmallIcon(R.drawable.ic_notification) .setContentTitle("标题") .setContentText("内容") .setPriority(NotificationCompat.PRIORITY_DEFAULT); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(1, builder.build()); // 简单存储 SharedPreferences preferences = getPreferences(Context.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("key", "value"); editor.apply(); // 文件存储(内部) String fileName = "data.txt"; String content = "Hello World!"; FileOutputStream outputStream; try { outputStream = openFileOutput(fileName, Context.MODE_PRIVATE); outputStream.write(content.getBytes()); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } // 数据库存储 SQLiteDatabase database = openOrCreateDatabase("my_database", Context.MODE_PRIVATE, null); database.execSQL("CREATE TABLE IF NOT EXISTS my_table (id INTEGER PRIMARY KEY, name TEXT)"); ContentValues values = new ContentValues(); values.put("name", "张三"); database.insert("my_table", null, values); // WebView WebView webView = findViewById(R.id.web_view); webView.loadUrl("https://www.google.com"); // 第三方类库/自选功能 // TODO: 导入第三方类库,或者实现自选功能 } } ``` 注意:上述代码仅包含示例,具体实现需要根据您的需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值