android 记录笔记



android 文字过多只想显示多行多余的文字用省略号代替和调整行间距的属性

 <TextView
            android:id="@+id/huodong_index_hequnhuodong_item_tv_tesexiangqing"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:maxLines="3"        
            android:lineSpacingExtra="3dp"   />

ps: 红色字代表文字过多只想显示多行多余的文字用省略号代替的方法,蓝色字代表调整行间距的属性

如果要让TextView只显示一行,多出部分用省略号代替的话非常容易,只需要为xml文件中的TextView控件添加android:singleLine="true"即可

android:lines="2"  表示行数

2018/6/2号  研究了三天的bug终于解决  界面卡顿  recycler播放不流畅卡顿问题
主要就是绘制的界面太多了  找到了一篇很给力的博客 记录下
https://www.jianshu.com/p/76ecd3b6751



自己笔记  每天时时刻刻都会更新  看到好就会添加进来
  //创建File对象  取出file文件中指定的file名
            file = new File(StringConstants.FILE_PATH_DOUYIN);
            //获取该目录下的所有文件  
            File[] subFile = file.listFiles();
            //listFiles是获取该目录下所有文件
            for (int iFileLength = 0; iFileLength < subFile.length; iFileLength++) {
                // 判断是否为文件夹
                if (!subFile[iFileLength].isDirectory()) {
                    String filename = subFile[iFileLength].getName();
                    // 判断是否为MP4结尾
                    if (filename.trim().toLowerCase().endsWith(".mp4") || filename.trim().toLowerCase().endsWith(".jpg")) {

                        //获取到下载成功的资源名
                        resourceName = filename;
                    }
                }
            }

// 分割字符串
for (NotDownloadUser notdownList : list_videoRoute) { String video_route = notdownList.getVideo_route(); String[] a = video_route.split("/"); for (int i = 0; i < a.length; i++) { ss = a[a.length - 1]; } Log.d("homeVidwoService", " 查询的下载资源 " + ss); }

selector选择的器

<?xml version="1.0" encoding="utf-8" ?>   
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<!-- 默认时的背景图片-->  
  <item android:drawable="@drawable/pic1" />    
<!-- 没有焦点时的背景图片 -->  
  <item android:state_window_focused="false"   
        android:drawable="@drawable/pic1" />   
<!-- 非触摸模式下获得焦点并单击时的背景图片 -->  
  <item android:state_focused="true" android:state_pressed="true"   android:drawable= "@drawable/pic2" /> 

<!-- 触摸模式下单击时的背景图片-->  

<item android:state_focused="false" android:state_pressed="true"   android:drawable="@drawable/pic3" />  

<!--选中时的图片背景-->  

  <item android:state_selected="true"   android:drawable="@drawable/pic4" />   

<!--获得焦点时的图片背景-->  

  <item android:state_focused="true"   android:drawable="@drawable/pic5" />   
</selector>

相关属性:

android:state_selected是选中
android:state_focused是获得焦点
android:state_pressed是点击
android:state_enabled是设置是否响应事件,指所有事件



存储日志功能实现:开个线程,实时把打印的信息加入缓存  缓存满了写入IO。不要来一条就进行io操作,io操作比较耗时,

容易卡顿,甚至导致ANR


oncreate和oncreateview的区别

onCreate是指创建该fragment类似于Activity.onCreate,你可以在其中初始化除了view之外的东西,onCreateView是创建该fragment对应的视图,你必须在这里创建自己的视图并返回给调用者,例如

return inflater.inflate(R.layout.fragment_settings, container, false);。

super.onCreateView有没有调用都无所谓,因为super.onCreateView是直接返回null的。


Android Studio的全局查找快捷键:Ctrl+F,全局替换快捷键:Ctrl+R


点击全屏件 webview 从之前的的固定大小转换成全屏大小

 mWebView = (WebView) findViewById(R.id.test_webview);

        mWebView.loadUrl("https://v.qq.com/");

        mImgs = (ImageView) findViewById(R.id.test_imgs);

        mImgss = (ImageView) findViewById(R.id.test_imgss);

        mLayoutParams = (FrameLayout.LayoutParams) mWebView.getLayoutParams();

        mLayoutParams.height = 400;

        mLayoutParams.width = 600 ;

        mWebView.setLayoutParams(mLayoutParams);

        mImgs.setOnClickListener(new View.OnClickListener() {

            private ImageView mImageView;

            @Override
            public void onClick(View view) {

                FrameLayout.LayoutParams mLayoutParams = new FrameLayout.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

                mWebView.setLayoutParams(mLayoutParams);

                mImgss.setVisibility(View.VISIBLE);


            }
        });

        mImgss.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                mLayoutParams = (FrameLayout.LayoutParams) mWebView.getLayoutParams();

                mLayoutParams.height = 400;

                mLayoutParams.width = 600 ;

                mWebView.setLayoutParams(mLayoutParams);

                mImgss.setVisibility(View.GONE);

            }
        });

    }

应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的。
大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中。
这样当该应用被卸载后,这些数据还保留在SDCard中,留下了垃圾数据。
如果你想让你的应用被卸载后,与该应用相关的数据也清除掉,该怎么办呢?

通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据

如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。

而且上面二个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项



android 模拟点击事件

       
  mButton = (Button) findViewById(R.id.btn);

    mButton.setOnClickListener( new View.OnClickListener() {

        @Override
        public void onClick(View view) {

            Toast.makeText(MainActivity.this, "老铁挺住", Toast.LENGTH_LONG).show();

        }
    });

       mc = new MyCount(3000, 1000);
       mc.start();

   }

/*定义一个倒计时的内部类*/
class MyCount extends CountDownTimer {
    public MyCount(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
    }


    @Override
    public void onTick(long millisUntilFinished) {

    }

    @Override
    public void onFinish() {

        mButton.performClick();  //调用 button的点击事件
    }
}
 

最简单的Dialog实现

AlertDialog.Builder builder = new AlertDialog.Builder(this);        //先得到构造器
        builder.setTitle("提示");                                         //设置标题
        builder.setMessage("是否确认退出");       //设置内容
        builder.setIcon(R.mipmap.ic_launcher);   //自定义图标
        builder.setCancelable(false);           //设置是否能点击,对话框的其他区域取消

        builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {     //设置其确认按钮和监听事件
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //  which,是哪一个按钮被触发
                //      其值如下:
                //   Dialog.BUTTON_NEGATIVE     忽略
                //   Dialog.BUTTON_POSITIVE     确认
                //   Dialog.BUTTON_NEUTRAL      取消            
                dialog.dismiss();
            }
        });

        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {     //设置其取消按钮和监听事件
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        builder.setNegativeButton("忽略", new DialogInterface.OnClickListener() {     //设置其忽略按钮和监听事件
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();     
            }
        });

        builder.create();       //创建对话框
        builder.show();         //显示对话框

    }

  可以利用Which的值,把以上的代码简化:
private void dialog1_1(){
        //先new出一个监听器,设置好监听
        DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){

            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch(which){
                    case Dialog.BUTTON_POSITIVE:
                        Toast.makeText(MainActivity.this, "确认" + which, Toast.LENGTH_SHORT).show();
                        break;
                    case Dialog.BUTTON_NEGATIVE:
                        Toast.makeText(MainActivity.this, "取消" + which, Toast.LENGTH_SHORT).show();
                        break;
                    case Dialog.BUTTON_NEUTRAL:
                        Toast.makeText(MainActivity.this, "忽略" + which, Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        };
        //dialog参数设置
        AlertDialog.Builder builder=new AlertDialog.Builder(this);  //先得到构造器
        builder.setTitle("提示"); //设置标题
        builder.setMessage("是否确认退出?"); //设置内容
        builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
        builder.setPositiveButton("确认",dialogOnclicListener);
        builder.setNegativeButton("取消", dialogOnclicListener);
        builder.setNeutralButton("忽略", dialogOnclicListener);
        builder.create().show();
    }


android 判断手指滑动方向

//手指按下的点为(x1, y1)手指离开屏幕的点为(x2, y2)  
  float x1 = 0;  
  float x2 = 0;  
  float y1 = 0;  
  float y2 = 0;  
hideSystemUI();这个方法我自己写的没用  删掉就可以了
@Override  
   public boolean onTouchEvent(MotionEvent event) {  
       //继承了Activity的onTouchEvent方法,直接监听点击事件  
       if (event.getAction() == MotionEvent.ACTION_DOWN) {  
           //当手指按下的时候  
           x1 = event.getX();  
           y1 = event.getY();  
       }  
       if (event.getAction() == MotionEvent.ACTION_UP) {  
           //当手指离开的时候  
           x2 = event.getX();  
           y2 = event.getY();  
           if (y1 - y2 > 50) {  
                
               Toast.makeText(MainActivity.this, "向上滑", Toast.LENGTH_SHORT).show();  
           } else if (y2 - y1 > 50) {  
               hideSystemUI();  
               Toast.makeText(MainActivity.this, "向下滑", Toast.LENGTH_SHORT).show();  
           } else if (x1 - x2 > 50) {  
               hideSystemUI();  
               Toast.makeText(MainActivity.this, "向左滑", Toast.LENGTH_SHORT).show();  
           } else if (x2 - x1 > 50) {  
               hideSystemUI();  
               Toast.makeText(MainActivity.this, "向右滑", Toast.LENGTH_SHORT).show();  
           }  
       }  
       return super.onTouchEvent(event);  
   }  


android动态添加布局

//设置界面的布局  
       mRelativeLayout = new RelativeLayout(this);  
       setContentView(mRelativeLayout);  
  
  
       //添加一个AbsoluteLayout子布局,并给这个布局添加一个iv  
       RelativeLayout abslayout = new RelativeLayout(this);  
       ImageView iv1 = new ImageView(this);  
       iv1.setImageResource(R.drawable.mo_codescanning_hui);  
       RelativeLayout.LayoutParams lp0 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,  
               ViewGroup.LayoutParams.WRAP_CONTENT);  
       abslayout.addView(iv1, lp0);  
  
       //将这个子布局添加到主布局中  
       //设置子布局在父容器位置  
       RelativeLayout.LayoutParams lp_big0 = new RelativeLayout.LayoutParams(  
               ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);  
       lp_big0.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.ALIGN_PARENT_LEFT);  
       mRelativeLayout.addView(abslayout, lp_big0);  
  
  
       //再添加一个子布局  右上btn  
       RelativeLayout relativeLayout1 = new RelativeLayout(this);  
       Button btn1 = new Button(this);  
       btn1.setText("确认");  
       RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams(  
               ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);  
       lp1.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.ALIGN_PARENT_RIGHT);  
       lp1.width = 200;  
       lp1.setMargins(0,0,20,50);  
       btn1.setLayoutParams(lp1);  
       relativeLayout1.addView(btn1, lp1);  
  
       //将这个布局添加到主布局中  
       RelativeLayout.LayoutParams lp_big1 = new RelativeLayout.LayoutParams(  
               ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);  
       lp_big1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);  
       mRelativeLayout.addView(relativeLayout1, lp_big1);  
         
  
       //再添加一个子布局  左下btn  
       RelativeLayout relativeLayout2 = new RelativeLayout(this);  
       Button btn2 = new Button(this);  
       btn2.setText("手动输入");  
       btn2.setTextSize(20);  
       btn2.getBackground().setAlpha(80);  
       RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(  
               ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);  
       lp2.width = 520;  
       lp2.setMargins(20,30,0,0);  
       btn2.setLayoutParams(lp2);  
       relativeLayout2.addView(btn2, lp2);  
  
       //将这个布局添加到主布局中  
       RelativeLayout.LayoutParams lp_big2 = new RelativeLayout.LayoutParams(  
               ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);  
       lp_big2.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);  
       mRelativeLayout.addView(relativeLayout2, lp_big2);  
  
       //再添加一个子布局 右下btn  
       RelativeLayout relativeLayout3 = new RelativeLayout(this);  
       Button btn3 = new Button(this);  
       btn3.setText("打开照明设备");  
       btn3.setTextSize(20);  
       btn3.getBackground().setAlpha(80);  
  
       RelativeLayout.LayoutParams lp3 = new RelativeLayout.LayoutParams(  
               ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);  
       lp3.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.ALIGN_PARENT_RIGHT);  
       lp3.width = 520;  
       lp3.setMargins(0,30,0,20);  
       btn3.setLayoutParams(lp3);  
       relativeLayout3.addView(btn3, lp3);  
  
       //将这个布局添加到主布局中  
       RelativeLayout.LayoutParams lp_big3 = new RelativeLayout.LayoutParams(  
               ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);  
       lp_big3.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);  
       mRelativeLayout.addView(relativeLayout3, lp_big3); 

EditText 关闭键盘, 不可输入

       mEditTexts.setInputType(InputType.TYPE_NULL);
                mEditTexts.setEnabled(false);

xml中加入一句代码如下:

android:focusableInTouchMode="true"

OkGo 请求数据

   //热点指数
        String hostpot_url = "http://v.juhe.cn/toutiao/index?type=top&key=2d222092ba994e3a928d46d83f097c8b";

        OkGo.get(hostpot_url)
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(String s, Call call, Response response) {

                        Gson gson = new Gson(); //Gson解析工具

                        Hotspot_Bean hotspot_bean = gson.fromJson(s, Hotspot_Bean.class); // 通过gson.from 取出Bean的值

                        // 取出Data的集合
                        mHotpost_data = hotspot_bean.getResult().getData();

                        GridLayoutManager hotpost = new GridLayoutManager(Activity_HomePage.this, 2);

                        mLock_hotspot.setLayoutManager(hotpost);

                       *//* Hotpost_Adapter hotpost_adapter = new Hotpost_Adapter(Activity_HomePage.this,mHotpost_data);

                        mLock_hotspot.setAdapter(hotpost_adapter);*//*
                    }

                    @Override
                    public void onError(Call call, Response response, Exception e) {
                        super.onError(call, response, e);
                    }
                });

URI   URL  URN 的区别

首先,URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。而URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。而URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。也就是说,URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。



 
 
 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值