android之一些骚操作

6.实现snackBar自定义布局的操作方式

/**
 * 向Snackbar中添加view
 * @param snackbar
 * @param layoutId 要加入的布局id
 *
 */
public static View SnackbarAddView(Snackbar snackbar, int layoutId) {
    View snackbarview = snackbar.getView();
    Snackbar.SnackbarLayout snackbarLayout=(Snackbar.SnackbarLayout)snackbarview;

    View add_view = LayoutInflater.from(snackbarview.getContext()).inflate(layoutId,null);

    LinearLayout.LayoutParams p = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
    p.gravity= Gravity.CENTER_VERTICAL;

    snackbarLayout.addView(add_view,1,p);//为了方便处理,直接将整个布局充满snackBar
    return add_view;
}
加入了布局之后需要设置监听或者其他操作可以进行如下操作

/**
 * 对 snackBar的设置
 * @param view 依赖的布局
 * @param myTitle 要显示得标题
 */
public void setSnackBar(View view,String myTitle) {
    snackbar = Snackbar.make(view, "", Snackbar.LENGTH_SHORT)
            .setDuration(4000);
    View addView = SnackBarUtils.SnackbarAddView(snackbar, R.layout.snack_layout);
    View sure = addView.findViewById(R.id.snack_sure);
    View cancel = addView.findViewById(R.id.snack_cancel);
    TextView title = (TextView) addView.findViewById(R.id.title);
    title.setText(myTitle);
    setOnClick(sure,cancel);
}
可以借鉴下面文章:注明出处:http://blog.csdn.net/love_xiaozhao/article/details/52237743

5.优雅实现recycleView的单选方式

直接上代码:

/**
 * 可以单选的recycleView适配器
 */

public class DepartmentChooseAdapter extends RecyclerView.Adapter {

    private List list = new ArrayList<>();
    private LayoutInflater inflater;
    private int mSelectedPos = -1;//上次选中的item的位置,初始为-1
    private callBack call;

    public DepartmentChooseAdapter(List list, Activity activity, callBack call) {
        this.list = list;
        inflater = LayoutInflater.from(activity);
        this.call = call;
    }

    @Override
    public DepartmentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new DepartmentViewHolder(inflater.inflate(R.layout.department_choose_item, parent, false));
    }

    @Override
    public void onBindViewHolder(final DepartmentViewHolder holder, final int position) {
        Depart depart = list.get(position);
        holder.txtName.setText(depart.getName());
        holder.checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //将上一次的holder里面的checkBox关闭,使用回调
                call.closeCheck(mSelectedPos);
                //将现在的checkBox选中更新position
                mSelectedPos = position;
                holder.checkBox.setChecked(true);
            }
        });
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public void addAll(List list) {
        if (list == null || list.size() == 0) {
            return;
        }
        this.list = list;
        notifyDataSetChanged();
    }

    /**
     * 获取选中item的位置
     *
     * @return
     */
    public int getPosition() {
        return mSelectedPos;
    }

    public interface callBack {
        void closeCheck(int lastPosition);
    }

    public static class DepartmentViewHolder extends ViewHolder {
        public CheckBox checkBox;
        LinearLayout lin;
        TextView txtName;

        public DepartmentViewHolder(final View itemView) {
            super(itemView);
            txtName = (TextView) itemView.findViewById(R.id.txt_name);
            checkBox = (CheckBox) itemView.findViewById(R.id.departChoose_check);
            lin = (LinearLayout) itemView.findViewById(R.id.departChoose_lin);
        }
    }
}

可以看到,在这里使用回调的方式,将一些操作放到了Activity里面了:

final RecyclerView recyclerView = findViewByIdNoCast(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView
        .addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
madapter = new DepartmentChooseAdapter(list, this, new DepartmentChooseAdapter.callBack() {
    @Override
    public void closeCheck(int lastPosition) {
        if (lastPosition != -1) {
            DepartmentChooseAdapter.DepartmentViewHolder lastHolder = (DepartmentChooseAdapter.DepartmentViewHolder) recyclerView.findViewHolderForLayoutPosition(lastPosition);
            lastHolder.checkBox.setChecked(false);//关闭先前的checkBox
        }
    }
});
recyclerView.setAdapter(madapter);
如此进行操作 就可以进行单选了,要获得需要的数据,只需要调用适配器中的getposition方法,然后再在数据源中取得即可:

int position = madapter.getPosition();
Depart depart = list.get(position);//获得当前选中的depart

4.对多个EdtiText点击软键盘上的回车切换至下一个的操作

name="android:imeOptions">actionNext
可以设置这个属性,另外还有其他方法 见链接:注明下面这个是转载的

http://blog.csdn.net/u010461658/article/details/44700725

3.使用 static 关键字修饰内部类就不会持有外部类的强引用,这样不会造成内存泄露问题

比如 recycleView的 viewHolder

//底部加载更多item的viewholder
static class LoadMoreVH extends RecyclerView.ViewHolder {

    public LoadMoreVH(View itemView) {
        super(itemView);
    }
}

2.

Toolbar的右侧menu不能通过重新inflateMenu来更改,因为inflateMenu会重新增加一个menu,Toobar右侧按钮的隐藏与显示有一个专门的方法

隐藏

mToolbar.getMenu().findItem(0//R.id.moreMenu,别用后面的R.id.这种做法,这个可以看做是数组,用0,1,2来表示位置即可).setVisible(false);

显示

mToolbar.getMenu().findItem(0).setVisible(true);
上述方法存在问题:解决方法如下:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_targetedit_toolbar, menu);
    if(targetId != -1){//表示是详情页面
        menu.getItem(0).setVisible(false);//隐藏保存
        menu.getItem(1).setVisible(true);//显示编辑
    }
    return true;
}
需要在这个方法里面操作
1.将屏幕变暗/亮
 
  
private void makeWindowDark() {
    WindowManager.LayoutParams params = getWindow().getAttributes();
    params.alpha = 0.7f;//0.7变暗,设置为1f就可以恢复正常;
    getWindow().setAttributes(params);
}

你可能感兴趣的:(android之一些骚操作)