Android 零散学习笔记

来源:互联网 发布:java中socket编程实例 编辑:程序博客网 时间:2024/05/21 10:12

注:本学习笔记内容有来自网络社区,论坛,书籍,是我在学习的过程中总结的有用知识点,我不会用来获取任何利益,如果我侵犯了您的利益请联系我

Intent 用法

显式 Intent

Intent intent = new Intent(MainActivity.this,OtherActivity.class);startActivity(intent);

隐式 Intent
1.打开本机浏览器跳转到目标网址

Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDate(Uri.parse("http://www.sina.com"));startActivity(intent);

2.调用本机拨号器拨打电话

Intent intent = new Intent(Intent.ACTION_DIAL);intent.setDate(Uri.parse("tel:12306"));startActivity(intent);

上面的setDate数据主要是在哪里设置和区分的呢,在一个activity的 intent-filter中的date选项中,其中android:scheme 指定的就是上面的tel和http

        <activity            android:name=".MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />                <date android:scheme="http">            </intent-filter>        </activity>

data标签中主要可以配置的内容

android:scheme
用于指定数据的协议部分,比如上面的http和tel
android:host
用于指定数据的主机名部分,比如上面的 www.sina.com
android:port
用于指定数据的端口部分,一般紧随在主机名之后
android:path
用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容
android:mimeType
用于指定可以处理的数据类型,允许使用通配符的方式进行指定

启动活动的令一种方法 startActivityForResult(); 可以用来接收打开的activity返回来的数据。
startActivityForResult(intent,1); //第一个参数intent 实例,第二个参数识别码
此识别码用来标识跳转到的activity,具体用法如下:

    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        // TODO Auto-generated method stub        super.onActivityResult(requestCode, resultCode, data);        switch(requestCode){        case 1:  //这个1就是我们上面定义的识别码            if(resultCode == RESULT_OK){                //你要做的事情            }            break;            default:            break;        }    }

那么在打开的activity怎么返回数据呢

Intent intnet = new Intent();setResult(RESULT_OK,intent);finish();

RESULT_OK为返回的结果码

在activity中监听返回键点击处理函数

    @Override    public void onBackPressed() {        // TODO Auto-generated method stub        super.onBackPressed();        Toast.makeText(getApplicationContext(), "点击了返回键", Toast.LENGTH_SHORT).show();    }

EditText一个知识点

    <EditText        android:id="@+id/et_text"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <EditText        android:layout_width="wrap_content"        android:layout_height="wrap_content" />

上面一个EditText一个有id,一个没有id,当旋转屏幕的时候,有id的EditText会自动保存已经键入的内容,没有id的EditText则会清空

Button一个知识点

button.setEnabled(flase); 设置此属性后按钮虽然设置了监听但是也不能点击

隐藏软键盘

第一种方法

    InputMethodManager inputMethodManager = (InputMethodManager)currFragAct.getSystemService(currFragAct.INPUT_METHOD_SERVICE);    private boolean hideKeyboard(){        if(inputMethodManager.isActive(userText) || inputMethodManager.isActive(pswText)){        //因为是在fragment下,所以用了getView()获取view,也可以用findViewById()来获取父控件            loginButton.requestFocus();//强制获取焦点,不然getActivity().getCurrentFocus().getWindowToken()会报错            inputMethodManager.hideSoftInputFromWindow(currFragAct.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);            inputMethodManager.restartInput(userText);            inputMethodManager.restartInput(pswText);            return true;        }        return false;    }

第二种方法

    /**     * 当使用自定义的键盘时,需要隐藏系统弹出的软键盘,但是光标需要保留     */    private void editFocusControl() {        //获取系统版本号        int sdkInt = Build.VERSION.SDK_INT;         //如果是android 3.0以上版本,用下面的方法隐藏软键盘        if(sdkInt >= 11) {                 getWindow().setSoftInputMode(                           WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);                   try {                       Class<EditText> cls = EditText.class;                       Method setSoftInputShownOnFocus;                       setSoftInputShownOnFocus = cls.getMethod("setSoftInputShownOnFocus",                               boolean.class);                       setSoftInputShownOnFocus.setAccessible(false);                       setSoftInputShownOnFocus.invoke(mDialNumEdit, false);                   } catch (Exception e) {                       e.printStackTrace();                   }           }else {            //关闭软键盘,让手机始终不弹出软键盘            mDialNumEdit.setInputType(InputType.TYPE_NULL);        }    }

第三种方法

 View view = currFragAct.getWindow().peekDecorView();    if (view != null) {        InputMethodManager inputmanger = (InputMethodManager)currFragAct.getSystemService(Context.INPUT_METHOD_SERVICE);      inputmanger.hideSoftInputFromWindow(view.getWindowToken(), 0);    }

ScrollView中元素不能充满ScrollView的问题

ScrollView里只能放一个元素.
当ScrollView里的元素想填满ScrollView时,使用”fill_parent”是不管用的,必需为ScrollView设置:android:fillViewport=”true”。
我猜 当ScrollView没有fillVeewport=“true”时, 里面的元素(比如LinearLayout)会按照wrap_content来计算(不论它是否设了”fill_parent”),
而如果LinearLayout的元素设置了fill_parent,那么也是不管用的,因为LinearLayout依赖里面的元素,而里面的元素又依赖LinearLayout,
这样自相矛盾.所以里面元素设置了fill_parent,也会当做wrap_content来计算.

禁止gridview上下滚动

设置gridview 的touch事件,是ACTION_MOVE 的话返回truemDragGrid.setOnTouchListener(new OnTouchListener() {               @Override               public boolean onTouch(View v, MotionEvent event) {                    return MotionEvent.ACTION_MOVE == event.getAction() ? true                              : false;               }          });

TextView两个有用的属性

    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world"         android:singleLine="true"                                       //  只显示一行        android:textSize="28sp"        android:ellipsize="end"/>                                   //当文本超出屏幕空间,文本缩进方式

防止页面下面的功能按钮被输入法顶起来

        <activity            android:name=".HomeFragActivity"            android:windowSoftInputMode="adjustPan|stateHidden"/>

消除圆锯齿

         paint.setAntiAlias(true);           paint.setDither(true);           //画圆         canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|                 Paint.FILTER_BITMAP_FLAG));         canvas.drawCircle(this.l / 2, this.m / 2, this.j, this.b);

两个fragment之间传递参数

               在当前fragment里面 sf为要跳转的fragment                SearchProjectFragment sf = new SearchProjectFragment();                  Bundle bundle = new Bundle();                  bundle.putString("key", Projsid);                  sf.setArguments(bundle); 在sf中获取参数String string = getArguments().getString("key");  

android.textiview.settextcolor失效的问题

使用textview.setColor(getResources().getColor(R.color.xxx))不要使用textview.setColor(R.color.xxx)

activity 中 onNewIntent(Intent intent)方法

大家遇到一个应用的Activity供多种方式调用启动的情况,多个调用希望只有一个Activity的实例存在,这就需要Activity的onNewIntent(Intent intent)方法了。只要在Activity中加入自己的onNewIntent(intent)的实现加上Manifest中对Activity设置lanuchMode=“singleTask”就可以。

   onNewIntent()非常好用,Activity第一启动的时候执行onCreate()---->onStart()---->onResume()等后续生命周期函数,也就时说第一次启动Activity并不会执行到onNewIntent(). 而后面如果再有想启动Activity的时候,那就是执行onNewIntent()---->onResart()------>onStart()----->onResume().  如果android系统由于内存不足把已存在Activity释放掉了,那么再次调用的时候会重新启动Activity即执行onCreate()---->onStart()---->onResume()等。

不要忘记,系统可能会随时杀掉后台运行的Activity,如果这一切发生,那么系统就会调用onCreate方法,而不调用onNewIntent方法,一个好的解决方法就是在onCreate和onNewIntent方法中调用同一个处理数据的方法

 当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的Intent。

设置RadioGroup 中radioButton 间距

方法一:

            RadioGroup inputMethodGroup;            RadioGroup.LayoutParams params = new RadioGroup.LayoutParams(RadioGroup.LayoutParams.WRAP_CONTENT,RadioGroup.LayoutParams.WRAP_CONTENT);            params.setMargins(0, 0, 70, 0);            RadioButton radioButton = new RadioButton(mContext);            radioButton.setText(imeLabel);            radioButton.setButtonDrawable(R.drawable.radiobutton_selector);            radioButton.setPadding(60, 0, 0, 0);            radioButton.setTextSize(24);            inputMethodGroup.addView(radioButton,params);

方法二:
感觉有点投机取巧了,看到 radioButton.setText(imeLabel) 了吧,这个是设置radioButton名字,下一个view还是radioButton ,我们可以在 radioButton.setText(imeLabel+” “) 中多加入些空格,就自动隔开了下一个radioButon;神马参数设置都是浮云,哈哈哈哈。

VerifiError问题

在运行项目到一个网络请求的时候总是报这个错误,大致错误截图如下
这里写图片描述

看了一下上面的报错信息,截图中没有截出来,大致是找不到org下面的HttpClient,这个类,网上也查了下VerifiError都说是jar包问题,看了自己的build 库 确实是没有引,引入这两个包就好了
这里写图片描述

添加Fragment到返回栈,点击返回键可以返回上一个fragment

FragmentTransaction ft2 = getFragmentManager().beginTransaction();
ft2.replace(R.id.searoot_frame, new FragmentSeaGateStoryBookView());
ft2.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft2.addToBackStack(null);
ft2.commit();

模拟back键代码,返回到上一个fragment
getSupportFragmentManager().popBackStack();//suport.v4包
或getFragmentManager().popBackStack();

App因内容过多导致的启动延迟,白屏

在主Activity的theme中设置一下内容,自己设置个颜色或者放一张图片都可以,就像QQ的那个启动图

        <activity            android:name="com.tcl.userguide.MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>
    <style name="AppTheme" parent="AppBaseTheme">        <!-- All customizations that are NOT specific to a particular API-level can go here. -->    <item name="android:windowNoTitle">true</item>    <item name="android:windowBackground">@drawable/logo</item>    </style>

得到Activities栈顶的Activity类名,包名,类全路径

具体 步骤如下:
1、 得到当前运行环境(context)的Activity管理器;
2. 通过Activity管理器得到当前的任务栈信息;
3. 从任务栈中获得栈顶的Activity的名称。
具体读者可以参看下面的代码和Android帮助文档。
代码举例 :

String getTopActivity(Activity context){ActivityManager manager = (ActivityManager)context.getSystemService(ACTIVITY_SERVICE) ;List<RunningTaskInfo> runningTaskInfos = manager.getRunningTasks(1) ;if(runningTaskInfos != null)return (runningTaskInfos.get(0).topActivity).toString() ;elsereturn null ;}
最后不要忘记在AndroidManifest.xml中增加权限:<uses-permission android:name = “android.permission.GET_TASKS”/>ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); RunningTaskInfo info = manager.getRunningTasks(1).get(0); String shortClassName = info.topActivity.getShortClassName(); //类名 String className = info.topActivity.getClassName(); //完整类名 String packageName = info.topActivity.getPackageName(); //包名
1 0
原创粉丝点击