2018年11月15日 星期四

小米手機 apk安裝失敗

https://blog.csdn.net/f917386389/article/details/71079093

小米手机安装app,android studio一直提示:

DELETE_FAILED_INTERNAL_ERROR

Error while Installing APP

在MIUI 开发者选项中关闭 MIUI优化,重启手机以后,最后问题解决

允許 usb安裝應用

2018年8月23日 星期四

?attr/actionBarSize报错


升级android studio3.0.1之后 项目布局中的

?attr/actionBarSize全部标红报错,更改成

android:layout_height="?android:attr/actionBarSize" 

2018年8月14日 星期二

建立文件夾,文件寫入,內存,SD卡剩餘空間

        // ---先檢查權限-6.0 --------------------------
        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_READ_PHONE_STATE);
        }


//檢查SD
    public static boolean isSDCardEnable(){
        return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
    }

            //获取内存可用剩余空间
            long romFreeSpace=Environment.getDataDirectory().getFreeSpace();
            //获取SD卡可用剩余空间
            long SDFreeSpace= Environment.getExternalStorageDirectory().getFreeSpace();
            String formatter= android.text.format.Formatter.formatFileSize(this,romFreeSpace);
            String SDformatter= android.text.format.Formatter.formatFileSize(this,SDFreeSpace);
            Log.e("Debug","內存可用"+ formatter);
            Log.e("Debug","sd卡可用"+ SDformatter);



 String directoryPath= Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"File_Text_Demo"+File.separator;  // 路徑  路徑資料夾下
 String FileName= directoryPath+getNowTime()+".txt";  // 路徑 + 檔案名稱
    //建立文件夾 及 檔案
    public void CreatText(){
        File file=new File(directoryPath);
        if(!file.exists()){
            try {
               //按照指定的路径创建文件夹
                file.mkdirs();
            }catch (Exception e){

            }
        }
         File dir= new File(FileName);
        if(!dir.exists()){
            try{
                dir.createNewFile(); //在指定的文件中創建文件
                Log.e("Debug"," 創建成功");

            }catch (Exception e){
            }
        }
    }

//文件內容
 public void print( String str){
        FileWriter fw=null;
        BufferedWriter bw=null;
        String datetime="";
        try{
            CreatText();
            SimpleDateFormat tempDate=new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss");
            datetime= tempDate.format(new Date().toString());   //轉為字串
            fw= new FileWriter(FileName,true);
            // 创建FileWriter对象,用来写入字符流
       /**
                     * 如果想要每次写入,清除之前的内容,使用FileOutputStream流
                     */
          bw=new BufferedWriter(fw);// 将缓冲对文件的输出
          String myreadline= datetime+","+str;
          bw.write(myreadline + "\n"); //寫入文件
            bw.newLine();
            bw.flush();
            bw.close();
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
            try {
                bw.close();
                fw.close();
            } catch (IOException e1) {
            }
        }
    }


//當前時間
    public static String getNowTime(){
        //  SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date(System.currentTimeMillis());
        return simpleDateFormat.format(date);
    }

文件路径用的File.separator和直接打“\\”有什么区别

在windows中的文件分隔符是 \ 和 /都可以

但是在Linux中,文件分隔符只能是/

所以用了\\的程序在Linux下会出问题。

而File.separator是系统默认的文件分割符号,屏蔽了这些系统的区别。

用File.separator保证了在任何系统下不会出错。

2018年8月13日 星期一

OkHttpClient get 數據

private void getOkhttp(){
runOnUiThread(new Runnable() {
            @Override
            public void run() {

                OkHttpClient client=new OkHttpClient.Builder()
                        .connectTimeout(10, TimeUnit.SECONDS)
                        .readTimeout(10,TimeUnit.SECONDS)
                        .build();

  String url="https://www.google.com.tw/";
                Request request = new Request.Builder()
                        .get()
                        .url(url)
                        .build();
           
                client.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        Log.e("Debug"," get----------onFailure--->");
                    }
                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                       final String string = response.body().string();
                    //    byte[] b = response.body().bytes(); //获取数据的bytes
                   //  String info = new String(b, "gb2312"); //然后将其转为gb2312
                   
                    }
                });

            }
        });
}


    public void get2(){

            OkHttpClient client=new OkHttpClient.Builder()
                        .connectTimeout(10, TimeUnit.SECONDS)
                        .readTimeout(10,TimeUnit.SECONDS)
                        .build();


        //post
        String a="050";
        String b="050"; 

        RequestBody requestBodyPost = new FormBody.Builder()
                .add("a", a)
                .add("b", b)
                .build();
         Request requestPost = new Request.Builder()
                .url("https://www.google.com.tw/"+a+b)
                .post(requestBodyPost)
                .build();
        client.newCall(requestPost).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("Debug"," post----------onFailure--->");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
             //   final String string = response.body().string();
             //okhttp的锅…response.body().string()中的string()方法只能调用一次……….坑死
                String html = new String(response.body().bytes(), "big5");
               

            }
        });

    }

reycleview 寬高問題,item高度設置

//reycleview  item高度設置
class SpaceItemDecoration extends RecyclerView.ItemDecoration {
    int mSpace;
    /**
     * Retrieve any offsets for the given item. Each field of <code>outRect</code> specifies
     * the number of pixels that the item view should be inset by, similar to padding or margin.
     * The default implementation sets the bounds of outRect to 0 and returns.
     * <p>
     * <p>
     * If this ItemDecoration does not affect the positioning of item views, it should set
     * all four fields of <code>outRect</code> (left, top, right, bottom) to zero
     * before returning.
     * <p>
     * <p>
     * If you need to access Adapter for additional data, you can call
     * {@link RecyclerView#getChildAdapterPosition(View)} to get the adapter position of the
     * View.
     *
     * @param outRect Rect to receive the output.
     * @param view    The child view to decorate
     * @param parent  RecyclerView this ItemDecoration is decorating
     * @param state   The current state of RecyclerView.
     */
    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        outRect.left = mSpace;
        outRect.right = mSpace;
        outRect.bottom = mSpace;
        if (parent.getChildAdapterPosition(view) == 0) {
            outRect.top = mSpace;
        }

    }

    public SpaceItemDecoration(int space) {
        this.mSpace = space;
    }
}

使用:
  recyclerView.addItemDecoration(new SpaceItemDecoration(5)); 可以設定 item 與 item之間的高度

//-------------------------------------------------------------------------------------------------------------

 RecyclerView的item的宽高问题
            View view = LayoutInflater.from(context).inflate(R.layout.test_test,null);
            上面的做法就会出问题

            改成这样就可以正常显示设置的宽高
            View view = LayoutInflater.from(context).inflate(R.layout.test_test,parent,false);

自訂義的Toash

 
 public static void showToast(final Activity activity, final String word, final long time){
        activity.runOnUiThread(new Runnable() {
            public void run() {
                final Toast toast = Toast.makeText(activity, word, Toast.LENGTH_LONG);
                toast.show();
                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    public void run() {
                        toast.cancel();
                    }
                }, time);
            }
        });
    }

Sock 创建客户端 & 服务器的连接


      public void connet(){
        // 步骤1:创建客户端 & 服务器的连接
        // 创建Socket对象 & 指定服务端的IP及端口号
        try {
            socket=new Socket(); 
            socket   = new Socket("192.168.10.14", 55555);
            socket.setSoTimeout(1000); //設超時
            socket.isConnected();  
            Log.e("Debug","連接"+ socket.isConnected());
            Toast.makeText(this, "連接"+socket.isConnected(), Toast.LENGTH_SHORT).show();
            if( socket.isConnected()){
                two();
            }
        } catch (IOException e) {
            Log.e("Debug","IOException"+ socket.isConnected());
            Toast.makeText(this, "IOException"+socket.isConnected(), Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
        // 判断客户端和服务器是否连接成功
    }


   //   <-- 操作2:发送数据 到 服务器 -->
   
第一種方式
    public void sennd1(){
        //   <-- 操作2:发送数据 到 服务器 -->
        // 步骤1:从Socket 获得输出流对象OutputStream
        // 该对象作用:发送数据
        OutputStream outputStream = null;
        try {
            outputStream = socket.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 步骤2:写入需要发送的数据到输出流对象中 
        for(int i = 0 ; i < 5 ; i++){
            try {
                outputStream.write(("Carson_Ho"+i+"\n").getBytes("utf-8"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 特别注意:数据的结尾加上换行符才可让服务器端的readline()停止阻塞
        // 步骤3:发送数据到服务端
        try {
        outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            // 步骤3:断开客户端 & 服务器 连接
             outputStream.close();
            // 断开 客户端发送到服务器 的连接,即关闭输出流对象OutputStream
            br.close();
            // 断开 服务器发送到客户端 的连接,即关闭输入流读取器对象BufferedReader
            socket.close();
            // 最终关闭整个Socket连接
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

第二種方式 
 
   public void sennd2(){ 
        //   <-- 操作2:发送数据 到 服务器 -->
        // 步骤1:从Socket 获得输出流对象OutputStream
        // 该对象作用:发送数据 
        // 步骤2:写入需要发送的数据到输出流对象中
        try {
            //向服务器端发送数据
            Map<String, String> map = new HashMap<String, String>();
            map.put("name","aa");
            map.put("img","bb");
            map.put("op","cc"+"");
            JSONObject json = new JSONObject(map);
            String jsonString = "";
            jsonString = json.toString(); 
            //将String转化为byte[]
            //byte[] jsonByte = new byte[jsonString.length()+1];
            byte[] jsonByte = jsonString.getBytes();
            DataOutputStream outputStream = null;
            outputStream = new DataOutputStream(socket.getOutputStream());
            System.out.println("发的数据长度为:"+jsonByte.length);
            outputStream.write(jsonByte);
            outputStream.flush();
            System.out.println("传输数据完毕");
            socket.shutdownOutput();

            Toast.makeText(this, "Carson_ho", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

public void service(){
        // <-- 操作1:接收服务器的数据 -->
        // 步骤1:创建输入流对象InputStream
        InputStream is = null;
        try {
            is = socket.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 步骤2:创建输入流读取器对象 并传入输入流对象
        // 该对象作用:获取服务器返回的数据
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);

        // 步骤3:通过输入流读取器对象 接收服务器发送过来的数据
        try {
            br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2018年8月11日 星期六

okhttp 設置 big5


      @Override
      public void onResponse(Call call, Response response) throws IOException {
//             final String string = response.body().string();
                byte[] b = response.body().bytes(); //获取数据的bytes
               String info = new String(b, "Big5"); //然后将其转为Big5
             }
        }); 
 or 
            @Override
            public void onResponse(Call call, Response response) throws IOException {
             //   final String string = response.body().string();
            //okhttp…response.body().string()中的string()方法只能调用一次………. 
              String html = new String(response.body().bytes(), "big5");  //轉 big5

            }
        });
 -------------------------------------------------------------
okhttp异常
java.lang.IllegalStateException: closed
okhttp3.internal.http.Http1xStream$ChunkedSource.read(Http1xStream.java:418)
okhttp …response.body().string()中的string()方法只能调用一次 

2018年8月2日 星期四

算两个时间差(精确到毫秒)

     
Java中计算两个时间差(精确到毫秒)
 SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        long between = 0;
        try {
            java.util.Date begin = dfs.parse("2009-07-10 10:22:21.214");
            java.util.Date end = dfs.parse("2009-07-20 11:24:49.145");
            between = (end.getTime() - begin.getTime());// 得到两者的毫秒数
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        long day = between / (24 * 60 * 60 * 1000);
        long hour = (between / (60 * 60 * 1000) - day * 24);
        long min = ((between / (60 * 1000)) - day * 24 * 60 - hour * 60);
        long s = (between / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
        long ms = (between - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000
                - min * 60 * 1000 - s * 1000);
        System.out.println(day + "天" + hour + "小时" + min + "分" + s + "秒" + ms
                + "毫秒");



-----------------------------------------------------------------------------------------------------------

android 計算時間相差
Date dateStart = format.parse(info.stratTime);
Date dateEnd = format.parse(info.endTime);
//date.getTime()所返回的是一个long型的毫秒数
Long time = (Long) ((dateEnd.getTime() - dateStart.getTime())/1000);
int second = (int) (time % 60); 
int minute = (int) (time / 60 % 60);
int hour = (int) (time / 60 / 60);
texts[0] += "  " + hour + "時" + minute + "分" + second + "秒";

2018年7月17日 星期二

android 定位權限

若是6.0以及以上的话,那么便去判断是否已经授权,若是没有授权,那么便会去申请授权。若是已经授权,那么便直接执行我们的操作。

    final int  LOCATION_CODE = 1 ;

   //获取权限(如果没有开启权限,会弹出对话框,询问是否开启权限)
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            //请求权限
            Log.e("Debug","请求权限");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_CODE);
        } else {

        }



授权回调。询问是否同意授权的时候,系统会弹出对话框,我们选择之后,会进行回调。在回调里面进行判断

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case LOCATION_CODE: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED
                        && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                    // 权限被用户同意。
                    // 执形我们想要的操作
                } else {
                 
                }
            }
        }
    }

转载请标明出处:http://www.cnblogs.com/tangZH/p/8969898.html 

2018年7月9日 星期一

首字符为字母&特殊字符清除&空字串

 //判断一个字符串的首字符是否为字母

    public   static   boolean   test(String   s) 
  { 
            char   c   =   s.charAt(0); 
            int   i   =(int)c; 
                    if((i>=65&&i<=90)||(i>=97&&i<=122)) 
                    { 
                              return   true; 
                    } else 
                    { 
                           return   false; 
                    } 
  }

// 清除掉所有特殊字符
    public static String stringFilter(String str)   {
     
        String regEx = "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?[-]]";
        Pattern p=null;
        Matcher m=null;
        try{
              p = Pattern.compile(regEx);
              m = p.matcher(str);
        }catch (PatternSyntaxException e){
            e.printStackTrace();
        }
        return m.replaceAll("").trim();
    }

    //過濾 空字串
    public  String cleanT(String s){
       s = s.trim();
       return s;
    }

2018年7月1日 星期日

軟鍵盤,標題欄、部分控件會被頂上去,解決方式

本文章来自CSDN博客:http://blog.csdn.net/zhaokaiqiang1992,转载请注明地址!

在AndroidManifest.xml 添加  android:windowSoftInputMode ="adjustPan";
解決標題欄、部分控件會被頂上去





android:windowSoftInputMode属性详解


 android:windowSoftInputMode属性一共有9个取值,分别是:
stateUnspecified,stateUnchanged,stateHidden,stateAlwaysHidden,stateVisible,stateAlwaysVisible,adjustUnspecified,adjustResize,adjustPan。


  1.stateUnspecified
中文意思是未指定状态,当我们没有设置android:windowSoftInputMode属性的时候,软件默认采用的就是这种交互方式,系统会根据界面采取相应的软键盘的显示模式,比如,当界面上只有文本和按钮的时候,软键盘就不会自动弹出,因为没有输入的必要。那么,当界面上出现了获取了焦点的输入框的时候,软键盘会不会自动的弹出呢?这个还真不一定!比如,在下面的这个界面布局中,软键盘并不会自动弹出。

就是说,默认的,在这种界面情况下,系统并不确定用户是否需要软键盘,因此不会自动弹出。但是,为什么说不一定呢?这是因为,如果我们在这个布局的外面,包裹上一个
ScrollView,软键盘就会自动的弹出来了!
如下,在这种布局文件下,软键盘会自动的弹出

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <ScrollView
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent" >
  9. <LinearLayout
  10. android:layout_width="match_parent"
  11. android:layout_height="wrap_content"
  12. android:orientation="vertical" >
  13. <Button
  14. android:layout_width="match_parent"
  15. android:layout_height="wrap_content"
  16. android:onClick="toOther"
  17. android:text="跳转" />
  18. <EditText
  19. android:layout_width="match_parent"
  20. android:layout_height="wrap_content" />
  21. </LinearLayout>
  22. </ScrollView>
  23. </LinearLayout>

这确实是一个很奇怪的判断方式。因此,我们可以得出结论,当设置属性为stateUnspecified的时候,系统是默认不弹出软键盘的,但是当有获得焦点的输入框的界面有滚动的需求的时候,会自动弹出软键盘。至于为什么非要强调要获取焦点的输入框,这是因为,如果不是输入框获取焦点,软键盘也是不会自动弹出的,让界面不自动弹出软键盘的其中一个解决方案,就是在xml文件中,设置一个非输入框控件获取焦点,从而阻止键盘弹出。

   2.stateUnchanged
    中文的意思就是状态不改变的意思,我们应该怎么理解这句话呢?其实很好理解,就是说,当前界面的软键盘状态,取决于上一个界面的软键盘状态。举个例子,假如当前界面键盘是隐藏的,那么跳转之后的界面,软键盘也是隐藏的;如果当前界面是显示的,那么跳转之后的界面,软键盘也是显示状态。

    3.stateHidden
    顾名思义,如果我们设置了这个属性,那么键盘状态一定是隐藏的,不管上个界面什么状态,也不管当前界面有没有输入的需求,反正就是不显示。因此,我们可以设置这个属性,来控制软键盘不自动的弹出。

    4.stateAlwaysHidden
    这个属性也可以让软键盘隐藏,但是我暂时还不知道和stateHidden属性的区别,本来想去stackOverFlow上问一下的,但是,Great Wall,呵呵呵...祝愿病魔早日战胜方校长
    
    5.stateVisible
    设置为这个属性,可以将软键盘召唤出来,即使在界面上没有输入框的情况下也可以强制召唤出来。

  6.stateAlwaysVisible
    这个属性也是可以将键盘召唤出来,但是与stateVisible属性有小小的不同之处。举个例子,当我们设置为stateVisible属性,如果当前的界面键盘是显示的,当我们点击按钮跳转到下个界面的时候,软键盘会因为输入框失去焦点而隐藏起来,当我们再次回到当前界面的时候,键盘这个时候是隐藏的。但是如果我们设置为stateAlwaysVisible,我们跳转到下个界面,软键盘还是隐藏的,但是当我们再次回来的时候,软键盘是会显示出来的。所以,这个Always就解释了这个区别,不管什么情况到达当前界面(正常跳转或者是上一个界面被用户返回),软键盘都是显示状态。
    说到这里,我联想到了上面的stateHidden和stateAlwaysHidden,我估计区别也是这样的,就是说,stateAlwaysHidden无论如何都是隐藏的,但是如果在跳转到下个界面的时候,软键盘被召唤出来了,那么当下个界面被用户返回的时候,键盘应该是不会被隐藏的,但是,我还没有找到能够跳转到下个界面,还让当前界面软键盘不消失的方法,所以暂时不能验证。

7.adjustUnspecified
    从这个属性开始,就不是设置软键盘的显示与隐藏模式了,而是设置软键盘与软件的显示内容之间的显示关系。当你跟我们没有设置这个值的时候,这个选项也是默认的设置模式。在这中情况下,系统会根据界面选择不同的模式。如果界面里面有可以滚动的控件,比如ScrowView,系统会减小可以滚动的界面的大小,从而保证即使软键盘显示出来了,也能够看到所有的内容。如果布局里面没有滚动的控件,那么软键盘可能就会盖住一些内容,我们从下面的图中可以看出差别。

没有滚动控件,软键盘下面的布局都被遮挡住了,若想修改,只能隐藏软键盘,然后选择。而且,重点注意一下上面的布局,当我们选择的输入框偏下的时候,上面的标题栏和布局被软键盘顶上去了。记住这个特征,因为后面有个属性和这个的效果不一样。



布局里面有滑动控件,系统会自动的缩小整个界面的大小,因此,我们可以软键盘上面的小区域中显示所有的输入框。


  这就是两中显示模式之间的差别。

 8.adjustResize
    这个属性表示Activity的主窗口总是会被调整大小,从而保证软键盘显示空间。
    我们先看显示效果。
    注意观察这个上面的标题栏和按钮,设置为adjustResize属性之后,对于没有滑动控件的布局,虽然还是不能选择所有的输入框,但是,窗口的显示方式发生了变化,默认属性时,整个布局是被顶上去了,但是设置为adjustResize属性,布局的位置并没有发生什么变化,这就是最大的区别。

而对于有滑动控件的布局来说,显示效果和默认是一样的。


 9.adjustPan
    如果设置为这个属性,那么Activity的屏幕大小并不会调整来保证软键盘的空间,而是采取了另外一种策略,系统会通过布局的移动,来保证用户要进行输入的输入框肯定在用户的失业范围里面,从而让用户可以看到自己输入的内容。对于没有滚动控件的布局来说,这个其实就是默认的设置,如果我们选择的位置偏下,上面的标题栏和部分控件会被顶上去。但是对于有滚动控件的布局来说,则不太一样,我们看下面的效果图。
    首先,这是软键盘没有弹出的时候,有滚动控件的显示范围,最下面显示的是9.



 当我们点击5这个输入框,我们会发现下面的现象。
    最上面只能够显示到按钮,标题栏已经不能看到了。

    而最下面也只能滑动到8,下面的内容也不能够滑动了。

因此,我们就能够理解这个属性的作用了。

    通过以上的实验,我们可以得出结论,如果我们不设置"adjust..."的属性,对于没有滚动控件的布局来说,采用的是adjustPan方式,而对于有滚动控件的布局,则是采用的adjustResize方式。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bz419927089/article/details/39761461