文件管理器(一)

获取系统中安装的应用
//包管理器(应用包的信息获取)
PackageManager pm = context.getPackageManager();
//获取安装的应用
List<PackageInfo> list = pm.getInstalledPackages(0);

如果要获取用户安装的应用,则需要检测每个应用信息中的flag

PackageInfo info = list.get(i);
//用户安装
if(info.applicationInfo.flags != info.applicationInfo.FLAG_SYSTEM){
    //获取应用包名
    String packageName = info.packageName;
    //应用名称
    String appName = info.applicationInfo.loadLabel(pm).toString();
    //版本名称
    String versionName = info.versionName;
    //应用图片
    Drawable d = info.applicationInfo.loadIcon(pm);
    ...
}
线程池

ExecutorService类表示管理线程的容器,创建方式由Executors这个工厂类来创建

//线程池
private ExecutorService mService;

//创建线程池对象
//创建一个最大数量的线程池
mService = Executors.newFixedThreadPool(6);

// Executors.newCachedThreadPool()根据需要来创建工作线程的线程池
空闲线程一般等待60秒,如果没有任务需要处理将会被线程池回收

//线程池执行任务
Future f = mService.submit(Runnable...);
通过Future可以控制提交的任务,可以知道提交任务的执行状态
f.cancel(true) 取消任务
f.isCancelled() 检测是否被取消
f.isDone() 检测是否执行完毕

提交任务也可以用execute(这种方式不可控)
mService.execute(Runnable...)
Java中设置文本框的drawable
//设置文本周围的图标(设置右边有一个指示箭头)
tv.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.main_page_storage_bar_arrow, 0);
参数分别为drawableLeft,drawableTop,drawableRight,drawableBottom的资源

设置drawable和文本的边距
tv.setCompoundDrawablePadding(dp2px(5));
关于Android设备单位换算

dp转为px

private float dp2px(int dpValue) {
//获取屏幕密度
float density = getActivity().getResources().getDisplayMetrics().density;
return dpValue * density + 0.5;
}

px转为dp

private float px2dp(int pxValue) {
//获取屏幕密度
float density = getActivity().getResources().getDisplayMetrics().density;
return pxValue / density + 0.5;
}
DialogFragment

可以将Fragment以Dialog的形式显示出来
定义DialogFragment

public class NewFolderFragment extends DialogFragment {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //无标题
        setStyle(DialogFragment.STYLE_NO_TITLE, 0);
        // setCancelable(false); //配置是否可以按返回键隐藏Dialog
    }
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container
                            , Bundle savedInstanceState) {
        View layout = inflater.inflate(R.layout.fragment_new_folder, container, false);
        return layout;
    }
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        view.findViewById(R.id.btn_cancel).setOnClickListener(btnOnClick);
        view.findViewById(R.id.btn_sure).setOnClickListener(btnOnClick);
    }

    private View.OnClickListener btnOnClick = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.btn_cancel:
                dismiss();
                break;
            case R.id.btn_sure:
                //处理文件夹新建的事情
                dismiss();
                break;
            }
        }
    };
}

显示

private NewFolderFragment newFolderFragment;
private void showNewFolderDialog(){
    if(null == newFolderFragment){
        newFolderFragment = new NewFolderFragment();
    }
    //配置初始信息

    //显示
    newFolderFragment.show(getFragmentManager(),"newFolder");
}
主对象和从对象之间的通讯的问题

假设有类A和类B,A中对B有一个引用,这时候我们将A表示主,B表示从,情况如下:

class B{
...
public void setData(Object data)...
}
class A{
...
B b;
...
}

主向从中传递内容,可以直接用对象.方法(数据)

A-->B b.setData(...)

从向主传递数据,一般建议使用回调,可以在B中定义一个接口,然后对接口持有引用,在A中实现接口并且传递实现对象到B中,让B处理完事情时使用接口
实现对象返回数据

class B{
    ...
    public void setData(Object data)...

    public void doSomeThing(){
        ...
        //返回结果给主
        if(null != callBack){
            callBack.onResult(...);
        }
    }
    public interface CallBack{
        void onResult(Object data);
    }
    private CallBack callBack;

    public void setCallBack(CallBack callBack){
        this.callBack = callBack;
    }
}
class A{
    B b;

    void init(){
        b = new B();
        b.setCallBack(new CallBack(){
            public void onResult(Object data){
                //接收从B传过来的数据
                }
        });
    }
}

新建文件夹的逻辑

public class NewFolderFragment extends DialogFragment {

    ...
    //处理文件夹新建
    //创建好了,告诉文件列表将新创建好的文件显示出来
    if(null != onCreateListener){
        onCreateListener.onCerateOk(f);
    }
    ...

    /**
    * 定义了创建结果的监听器
    */
    public interface OnCreateListener{
        void onCerateOk(File file);
    }
    private OnCreateListener onCreateListener;

    public void setOnCreateListener(OnCreateListener onCreateListener) {
        this.onCreateListener = onCreateListener;
    }
}
文件列表调用新建文件夹的Fragment
private NewFolderFragment newFolderFragment;

private void showNewFolderDialog() {
    if (null == newFolderFragment) {
    newFolderFragment = new NewFolderFragment();
        //设置结果处理监听
        newFolderFragment.setOnCreateListener(new NewFolderFragment.OnCreateListener() {
            @Override
            public void onCerateOk(File file) {
                FileItem item = FileUtil.getInstance().file2FileItem(file);
                adapter.addFirstItem(item);
        }
    });
}
    //配置初始信息
    newFolderFragment.setFolder(currentFolder);
    //显示
    newFolderFragment.show(getFragmentManager(), "newFolder");
}
Fragment调用Activity中的方法

Activity中嵌入了Fragment,则在Fragment中可以通过getActivity()方法得到所依赖的目标Activity,如MainActivity中嵌入了文件列表FragmentFileList
MainActivity:

public class MainActivity extends AppCompatActivity{

    ...
    //显示/隐藏标题中的选择视图
    public void setTitleToosVisible(boolean isVisibility) {
        if (isVisibility) {
            selectToolsLayout.setVisibility(View.VISIBLE);
        } else {
            selectToolsLayout.setVisibility(View.GONE);
        }
    }
    //改变标题全选文本
    public void setSeleteAllText(boolean isSelectAll){
        if(isSelectAll){
            tvSelectAll.setText("取消全选");
        }else{
            tvSelectAll.setText("全选");
        }
    }
...
}

FragmentFileList:

...
if (!isSelectMode) {
    //进入选择模式
    isSelectMode = true;
    //显示选择模式的页面效果
    selectModeToolsLayout.setVisibility(View.VISIBLE);
    ((MainActivity) getActivity()).setTitleToosVisible(true);
} else {
    //如果长按的是已经选中的,则会取消选中的item,当取消完所有选中则需要退出选择模式
    if (currentSelectItems.isEmpty()) {
        //退出选择模式
        isSelectMode = false;
        //隐藏选择模式的页面效果
        selectModeToolsLayout.setVisibility(View.GONE);
        ((MainActivity) getActivity()).setTitleToosVisible(false);
    }
}
...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值