10月自学安卓

UI

recyclerView
导入包,gradle

compile 'com.android.support:design.25.3.1'

线性布局:
layout_margin 外边距
layout_padding 内边距
gravity=center 内部元素对齐方式
layout_gravity=center 当前组件的对齐方式
相对布局:
align_bottom🆔 跟…底部对齐
alignParentBottom=true 跟父空间底部对齐
TextView:
maxline=1
ellipSize=end ----用…代替容不下的
下划线,中划线
ScrollView和HorizontalScrollView:
内部只能有一个同级布局
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

一些基础

选项卡
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"

    android:id="@android:id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TabWidget
            android:layout_width="match_parent"
            android:id="@android:id/tabs"
            android:layout_height="wrap_content">

        </TabWidget>

        <FrameLayout
            android:layout_width="match_parent"
            android:id="@android:id/tabcontent"
            android:layout_height="match_parent">

        </FrameLayout>
    </LinearLayout>

</TabHost>
package com.example.tabhost;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.TabHost;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TabHost tabHost = findViewById(android.R.id.tabhost);
        tabHost.setup();
        LayoutInflater inflater = LayoutInflater.from(this);
        inflater.inflate(R.layout.left, tabHost.getTabContentView());
        inflater.inflate(R.layout.right, tabHost.getTabContentView());

        tabHost.addTab(tabHost.newTabSpec("left")
                .setIndicator("高锦良").setContent(R.id.left));
        tabHost.addTab(tabHost.newTabSpec("right")
                .setIndicator("小丑女").setContent(R.id.right));
    }

    /**  R.layout.left
     * <LinearLayout
     *     android:id="@+id/left"
     *     android:orientation="vertical"
     *     android:layout_width="match_parent"
     *     android:layout_height="match_parent"
     *     >
     *
     *     <ImageView
     *         android:layout_width="match_parent"
     *         android:layout_height="match_parent"
     *         android:src="@drawable/gao"/>
     * </LinearLayout>
     */


    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

}


网格视图实现QQ相册
<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2019-09-11"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        />
    <GridView
        android:id="@+id/gridView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="auto_fit"
        android:gravity="center"
        android:verticalSpacing="5dp"
        android:columnWidth="100dp">

    </GridView>


public class MainActivity extends AppCompatActivity {
    private int[] picture=new int []{
            R.drawable.img1,  R.drawable.img2,  R.drawable.img3,
            R.drawable.img4,  R.drawable.img5,
            R.drawable.img6,  R.drawable.img7,  R.drawable.img8,  R.drawable.img9
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        GridView gridView = findViewById(R.id.gridView);
        gridView.setAdapter(new ImageAdapter(this));
        //网格视图添加适配器
    }
    public class ImageAdapter extends BaseAdapter{
        private Context mContext;

        public ImageAdapter(Context mContext) {
            this.mContext = mContext;
        }

        @Override
        public int getCount() {
          return picture.length;
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            ImageView imageView;
            if (view==null){
                imageView = new ImageView(mContext);
                imageView.
                        setLayoutParams(new GridView.LayoutParams(300, 500));
                imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);//缩放
            }
            else {
                imageView = (ImageView)view;
            }
            imageView.setImageResource(picture[i]);
            return imageView;
        }
    }
}

单选按钮答题
Button button = findViewById(R.id.bottom);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                for (int i = 0; i < radioGroup.getChildCount(); i++) {
                    RadioButton radioButton = (RadioButton) radioGroup.getChildAt(i);
                    if (radioButton.isChecked()){
                        if (radioButton.getText().equals("B:2")) {
                            Toast.makeText(MainActivity.this, "right", Toast.LENGTH_SHORT).show();
                        }
                        else {
                            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                            builder.setMessage("2");
                            builder.setPositiveButton("all right", null);
                        }
                    }
                }
            }
        });
下拉列表
 <Spinner
        android:id="@+id/spinner"
        android:entries="@array/ctype"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    </Spinner>


 <!--   <resources>
        <string-array name="ctype">
            <item>all</item>
            <item>movie</item>
            <item>book</item>
            <item>music</item>
            <item>group</item>
            <item>activity</item>
        </string-array>
    </resources>-->
Spinner spinner = findViewById(R.id.spinner);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                String str = adapterView.getItemAtPosition(i).toString();
                Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });
Intent跳到到电话,发短信

在这里插入图片描述

chronometer实现计时
android:gravity="center">

    <Chronometer
        android:id="@+id/chronometer"
        android:layout_width="300dp"
        android:layout_height="match_parent"
        android:textColor="#3700FF"
        android:layout_marginTop="10dp"
        tools:ignore="MissingConstraints"
        />
chronometer = findViewById(R.id.chronometer);
        chronometer.setBase(SystemClock.elapsedRealtime());
        chronometer.setFormat("%s");
        chronometer.start();
        chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
            @Override
            public void onChronometerTick(Chronometer chronometer) {
                if (SystemClock.elapsedRealtime()-chronometer.getBase()>=10000){
                    chronometer.stop();

                }
            }
        });
activity之间传递信息
Onclick(){
		Intent intent=newIntent(MainActivity.this,AnotherActivity.class);
		//intent指向要启动的Activity
		new Bundle//包裹
		bundle.putCharSequence(" ",str)//包裹装东西
		intent.putExtras(bundle)//快递员放入包裹
		stratActivity(intent)//快递员开始送包裹
}
//另一个Activity中
		intent=getIntent() //快递员到了
		bundle=intent.getExtras()//快递员取出包裹
		String name=bundle.getString(" ") //拆包裹
		textView.setText(name)//用物品
全屏显示
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏显示
调用另一个Activity并返回结果
 		Onclick(){
 			new Intent指向要启动的Activity
 			startActivityForResult(intent,0x11)//请求码
 			}

//选择之后重写方法
OnActivityResult(){
		boundle=data.getExtras()
		int imageId=boundle.getInt("   ") //
		imageView.setImageResource(   imageId);
}

//在启动的Activity中
		intent=getIntent();
		new Bundle
		boundle.putInt("    ",image[i])//保存图片的数组  
		intent.putExtras(bundle)
		setResult(0x11,intent)
		finish()

微信Fragment

//第一个Fragment类
	WeChatFragment extends Fragment{
		View onCreateView(LayoutInflater inflater,....){
			View view=inflater.inflate(R.layout.布局文件,null);
			return view;
		}
	}
//在主Activity
imageView1.setOnClickListener(l);
imageView2.setOnClickListener(l);
imageView3.setOnClickListener(l);
imageView4.setOnClickListener(l);

View.OnClickListener l=new View.OnclickListener(){
	void Onclick(View v){
		FragmentManager fm=getFragmnetMnagener();
		FragmentTransaction ft=fm.beginTransaction();
		Fragment f=null;
		switch(v.getId){
		case R.id.image1:
			f=new Fragment1();
			break;
		case 
		.....
		default:
			break;
		}
		ft.replace(R.id.fragent,f);
		ft.commit();
	}
};

Intent

1.ComponentName可以调到另一个Activity

Intent intent=new Intent();
ComponentName componentName=new ComponentName("包名","包名.Activity类名");
intent.setComponent(componentName);
startActivity(intent);

2.setAction&setData调到打电话,发信息,浏览器

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button phone = findViewById(R.id.phone);
        Button message = findViewById(R.id.message);
        phone.setOnClickListener(listener);
        message.setOnClickListener(listener);


    }

    View.OnClickListener listener=new View.OnClickListener(){

        @Override
        public void onClick(View view) {
            Intent intent = new Intent();
            Button button = (Button) view;
            switch (button.getId()){
                case R.id.phone:
                    intent.setAction(intent.ACTION_DIAL);
                    intent.setData(Uri.parse("tel:17671426524"));
                    startActivity(intent);
                    break;
                case R.id.message:
                    intent.setAction(intent.ACTION_SENDTO);
                    intent.setData(Uri.parse("smsto:17671426524"));
                    intent.putExtra("sms_body","Android");
                    startActivity(intent);
                    break;
                    /**
                    浏览器
                    intent.setAction(intent.ACTION_VIEW);
                    intent.setData(Uri.parse("http://www.baidu.com"));
                    startActivity(intent);
                    **/
            }
        }
    };

}
//在ManiFest文件中开启权限
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.SEND_SMS" />

3.setFlags

intent.setFlags(intent.FLAG_ACTIVITY_NO_HISTORY);
//不在历史栈中保留,用户一旦离开即关闭

4.intent过滤器跳出打开方式

intent.setAction(intent.ACTION_VIEW);
startActivity(intent);
	//在Manifest文件注册的新的ACtivity中添加过滤器
	<activity android:name=".AnotherActivity">
            <intent-filter>
                <action android:name="android.intent.action.View" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

事件

1.再按一次返回

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            exit();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    private void exit() {
        if (System.currentTimeMillis() - exitTime > 2000) {
            Toast.makeText(MainActivity.this, "再按一次退出", Toast.LENGTH_SHORT).show();
            exitTime = System.currentTimeMillis();
        } else {
            finish();
            System.exit(0);

        }

    }

2.长按事件唤起菜单

 @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add("really?");
        menu.add("I'so excited");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button sure = findViewById(R.id.sure);
        sure.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                registerForContextMenu(view);
                openContextMenu(view);
                return false;
            }
        });
    }

3.单击事件与触摸事件区别
先响应触摸事件,如果触摸事件返回值为false,再响应单击事件

资源

1.在java中使用定义好的string.color,demem,array资源

sure.setText(getResources().getString(R.string.app_name));
title.setColor(getColor(R.color.title))
title.setTextSize(getResources().getDimension(R.demen.title))
String [] strs=getResources.getStringArray(R.array.list)

2.dp=边距,尺寸大小
sp=字体大小
3.在xml文件中使用布局资源

<include layout="@layout/image" />

4.数组资源
新建array.xml文件

<resources>
    <string-array name="list">
        <item>aa</item>
        <item>bb</item>
    </string-array>
</resources>

布局资源中使用

<ListView
        android:entries="@array/list"
        
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    </ListView>

5.StateListDrawable资源

在drawable目录下新建xml文件
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:color="#f60"></item>
    <item android:state_focused="false" android:color="#0a0"></item>
</selector>

使用xml文件

<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="YES"
        
        android:textColor="@drawable/focus"
        
        android:id="@+id/yes"
        android:layout_below="@id/text"
        android:layout_alignRight="@id/text"
        />
6.主题资源
	1.使用系统自带主题
	2.自定义主题
在style.xml文件中
<style name="bgTheme" parent="AppTheme">
        <item name="windowNoTitle">false</item>
        <item name="android:windowBackground">@drawable/ic_launcher_background
        </item>
    </style>
    
在manifest.xml中使用
android:theme="@style/bgTheme">
在java中使用
在setContentView之前
setTheme(R.style.byTheme)
样式资源
在style.xml中定义
<style name="title">
        <item name="android:textSize">30sp</item>
        <item name="android:textColor">#06f</item>
    </style>
    <style name="context" parent="title">
        <item name="android:textSize">18sp</item>
		 <item name="android:textStyle">bold</item>
        <item name="android:textColor">@color/colorPrimaryDark</item>
        <item name="android:layout_gravity">center_horizontal</item>
    </style>
使用
<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="高锦良"
        style="@style/title"/>
页面actionbar选项菜单
1.在res下新建menu目录,目录下新建menu.xml
2.写菜单
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/message" android:title="message"></item>
    <item android:id="@+id/homepage" android:title="homepage"/>
    <item android:id="@+id/help" android:title="help"></item>
    <item android:id="@+id/feedback" android:title="feedback"></item>

    
</menu>

3.重写onCreateOptionMenu方法,解析菜单资源文件,添加页面选项菜单

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = new MenuInflater(this);
        menuInflater.inflate(R.menu.menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

4.重写onOptionsItemSlected方法,添加选项菜单响应事件

@Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.message:
                Intent intent = new Intent(MainActivity.this, Main2Activity.class);
                startActivity(intent);
                break;
            case R.id.homepage:
                Intent intent1 = new Intent(MainActivity.this, MainActivity.class);
                startActivity(intent1);
        }
        return super.onOptionsItemSelected(item);
    }
组件添加上下文菜单

1.编写menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/copy" android:title="copy"></item>
    <item android:id="@+id/collect" android:title="collect"/>
</menu>

2.组件注册上下文菜单

//组件注册上下文菜单对象
        Button yes = findViewById(R.id.yes);
        registerForContextMenu(yes);

或者

Button sure = findViewById(R.id.sure);
        sure.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                registerForContextMenu(view);
                openContextMenu(view);
                return false;
            }
        });

3.重写方OcreateContextMenu法创建上下文菜单,解析menu.xml

 @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        MenuInflater menuInflater = new MenuInflater(this);
        menuInflater.inflate(R.menu.menu, menu);
    }

4.重写onContextItemSlected方法为菜单添加响应事件

public boolean onContextItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.copy:
                Toast.makeText(MainActivity.this," copy", Toast.LENGTH_SHORT).show();
                break;
            case R.id.collect:
                Toast.makeText(MainActivity.this, "collect", Toast.LENGTH_SHORT).show();
                break;
        }
        return true;
    }

ActionBar

manifest设置整个应用或一个actionbar的显示隐藏
		修改theme属性即可

控制actionbar的显示隐藏

 final ActionBar actionBar = getSupportActionBar();

        sure.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                actionBar.show();
            }
        });

        yes.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                actionBar.hide();
            }
        });
添加actionItem

1.编写菜单资源文件

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/search"
        android:icon="@mipmap/ic_launcher"  
        android:title="search"  //长按图标显示标题
        app:showAsAction="always"></item>
    <item android:id="@+id/bell"
        android:icon="@mipmap/ic_launcher"
        android:title="bell"
        app:showAsAction="ifRoom">//如果有空间就显示
    </item>
    <item
        android:id="@+id/about"
        android:title="about"
        app:showAsAction="never"></item>//隐藏在...中
    <item
        android:id="@+id/settings"
        android:title="settings"
        app:showAsAction="never" />
</menu>

2.重写方法,解析菜单文件,设置页面的选项菜单

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater =getMenuInflater() ;//一定要写成实例化,否则都隐藏在...
        menuInflater.inflate(R.menu.actionbar, menu);
        return super.onCreateOptionsMenu(menu);
    }
actionView实现actionbar搜索功能

1.编写资源文件

<item android:id="@+id/search"
        android:title="search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="always"></item>//注意app前缀
        
         <item android:id="@+id/img1"
         android:title="add">
        app:actionLayout="@layout/activity_main"//注意app前缀
        </item>//应用一个布局文件,里面设置了icon,位置,大小等资源
        

2.重写方法绘制页面optionmenu

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater =getMenuInflater() ;
        menuInflater.inflate(R.menu.actionview, menu);
        return super.onCreateOptionsMenu(menu);
    }
层级式导航(跳出的新页面中有向左的箭头)

1.在父Activity组件中添加事件监听器

Button toButton = findViewById(R.id.to);
        toButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, ToActivity.class);
                startActivity(intent);
            }
        });

2.在ToActivity中设置导航图标显示

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_to);
        
            //如果父Activity不为空,则设置导航图标显示
        if (NavUtils.getParentActivityName(ToActivity.this) != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            //设置向左的箭头图标
        }
    }

3.在manifest中配置父Activity

<activity android:name=".ToActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity" />
        </activity>
AlertDialog对话框
普通对话框:
	1.AlertDialog
	2.	setIcon
		setTitle
		setMessage
		setButton
	3.show()
列表对话框
	1.AlertDialog.Builder
	2.	setIcon
		setTitle
		setItems()  setSingleChoiceItems()   setMultiChoiceItems()
		setPositiveBotton
		builder.create().show()
Button b1 = findViewById(R.id.yesorno);
        Button b2 = findViewById(R.id.list);
        Button b3 = findViewById(R.id.radioButton);
        Button b4 = findViewById(R.id.checkbox);

        b1.setOnClickListener(new View.OnClickListener() {//带取消确定按钮的对话框
            @Override
            public void onClick(View view) {
                AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
                //在页面中创建对话框
                alertDialog.setIcon(R.drawable.ic_launcher_background);
                alertDialog.setTitle("高锦良");
                alertDialog.setMessage("I love you");
                alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "no", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Toast.makeText(MainActivity.this, "不再想想嘛", Toast.LENGTH_SHORT).show();

                    }
                });
                alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Toast.makeText(MainActivity.this, "对你好一辈子", Toast.LENGTH_SHORT).show();
                    }
                });
                alertDialog.show();

            }
        });

        b2.setOnClickListener(new View.OnClickListener() {//带列表显示的对话框
            @Override
            public void onClick(View view) {
                final String[] items = new String[]{
                        "1", "2", "3", "4"
                };
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setIcon(R.drawable.ic_launcher_background);
                builder.setTitle("你喜欢我哪一点");
                builder.setItems(items, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Toast.makeText(MainActivity.this, "你喜欢我" + items[i] + "对吗", Toast.LENGTH_SHORT).show();
                    }
                });
                builder.create().show(); //创建并显示对话框
            }
        });

        b3.setOnClickListener(new View.OnClickListener() {//单选列表
            @Override
            public void onClick(View view) {
                final String[] items = new String[]{
                        "1", "2"
                };
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setIcon(R.drawable.ic_launcher_background);
                builder.setTitle(" choose");
                builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Toast.makeText(MainActivity.this, "you choose " + items[i] + " right", Toast.LENGTH_SHORT).show();
                    }
                });//添加列表项,设置默认选中,并添加监听器
                builder.setPositiveButton("确定", null);
                builder.create().show();
            }
        });

       b4.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick (View view){
            final boolean[] checkItems = new boolean[]{
                    false, false, false
            };
            final String[] items = new String[]{
                    "gao", "jin", "liang"
            };
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setIcon(R.drawable.ic_launcher_background);
            builder.setTitle("What do you like");
            builder.setMultiChoiceItems(items, checkItems, new DialogInterface.OnMultiChoiceClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i, boolean b) {
                    checkItems[i] = b;//改变是否选中状态数组
                }
            });
            //添加多选列表目录和状态
            builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    String result = "";
                    for (int j = 0; j < checkItems.length; j++) {
                        if (checkItems[j]) {
                            result += items[j] + ",";
                        }
                    }
                    if (!result.equals("")) {
                        Toast.makeText(MainActivity.this, "you like" + result, Toast.LENGTH_SHORT).show();
                    }
                }
            });//点击确定,获取结果,发生事件
            builder.create().show();
        }

    });
BroadCastReceiver

1.发广播

		Button b1 = findViewById(R.id.b1);
        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setAction("gao");
                sendBroadcast(intent);
                //或者sendBroadcast(new Intent().setAction("gao"));

            }
        });
2.新建BroadCastReceiver向导,收到广播后toast
public class MyReceiver extends BroadcastReceiver {
    private static final String ACTION1 = "gao";

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        if (intent.getAction().equals(ACTION1)) {
            Toast.makeText(context, "myReceiver收到gao", Toast.LENGTH_SHORT).show();

        }

        throw new UnsupportedOperationException("Not yet implemented");
    }
}

3.manifest文件

		<receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="gao" />
            </intent-filter>
        </receiver>
通知

在这里插入图片描述

		NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Notification.Builder notification = new Notification.Builder(MainActivity.this);
        notification.setAutoCancel(true);//通知打开后自动消失
        notification.setSmallIcon(R.drawable.ic_launcher_background);
        notification.setContentTitle("大奖来袭");
        notification.setContentText("点击查看详情");
        notification.setWhen(System.currentTimeMillis());//设置通知发送时间
        notification.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
        //设置通知的声音和振动

        Intent intent = new Intent(MainActivity.this, ToActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
        notification.setContentIntent(pendingIntent);
        notificationManager.notify(NOTIFYID, notification.build());
        //点击通知跳转,而不是立即启动intent
}
        final int NOTIFYID=0x123;//通知ID
设置闹钟

1.布局一个timePicker 和一个确定按钮

<TimePicker
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/timePicker"
        android:layout_gravity="center">
    </TimePicker>

    <Button
        android:id="@+id/setAlarm"
        android:text="设置"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

2.新建弹出的闹钟Activity

package com.example.alarmclock;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.os.Bundle;

public class AlarmActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AlertDialog alertDialog = new AlertDialog.Builder(this).create();
        alertDialog.setIcon(R.drawable.ic_launcher_background);
        alertDialog.setTitle("闹钟时间");
        alertDialog.setMessage("起床了,小懒猪");
        alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确认", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {

            }
        });
        alertDialog.show();

    }
}

3.在主界面为Button添加响应事件

final TimePicker timePicker = findViewById(R.id.timePicker);
        timePicker.setIs24HourView(true);
        Button b2 = findViewById(R.id.setAlarm);
        b2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, AlarmActivity.class);
                PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
                AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

                Calendar calendar = Calendar.getInstance();
                calendar.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());
                calendar.set(Calendar.MINUTE, timePicker.getCurrentMinute());
                calendar.set(Calendar.SECOND, 0);
                alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

                Toast.makeText(MainActivity.this, "闹钟设置成功", Toast.LENGTH_SHORT).show();

            }
        });

绘制图形

绘制文本

1.自定义MyView,重写onDraw

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint =new Paint():
        paint.setColor(0xff000000);
        paint.setAntiAlias(true);
        paint.setTextAlign(Paint.Align.LEFT);
        paint.setTextSize(12);

        canvas.drawText("高锦良", 170, 160, paint);//起始的x与y坐标
    }
}

2.将View添加到页面的帧布局中

 FrameLayout frameLayout = findViewById(R.id.frameLayout);
        frameLayout.addView(new MyView(this));
        
绘制图片
Paint paint =new Paint();
       String path = Environment.getExternalStorageDirectory() + "/snail.png";
        Bitmap bitmap = BitmapFactory.decodeFile(path);
        //根据已有图片绘制bitmap

        canvas.drawBitmap(bitmap, 0, 0, paint);//显示bitmap

        Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 23,89, 150, 168);
        //截取成为新的bitmap
       canvas.drawBitmap(bitmap1, 270, 50, paint);
绘制路径
 Paint paint =new Paint();
        paint.setColor(0xffff6600);
        paint.setAntiAlias(true);
        paint.setTextAlign(Paint.Align.LEFT);
        paint.setTextSize(26);//默认单位sp
        paint.setStyle(Paint.Style.STROKE);//设置填充方式:描边

        Path path=new Path();
        path.addCircle(150, 100, 50, Path.Direction.CW);
        //圆心,半径,方向(CW:Clockwise)

        canvas.drawPath(path, paint);
        canvas.drawTextOnPath("I love you", path, 0, 0, paint);
        //两种显示路径
逐帧动画

1.编写动画资源文件,在drawable中

<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/ic_launcher_background"
        android:duration="60">
    </item>
    <item
        android:drawable="drawable/img01"
        android:duration="60">

    </item>
</animation-list>

2.在主界面应用动画资源

android:background="@drawable/fairy">

3.设置点击播放和暂停

    private boolean flag = false;//记录播放状态
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LinearLayout linearLayout = findViewById(R.id.layout);
        final AnimationDrawable anim = (AnimationDrawable) linearLayout.getBackground();

        linearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (flag == false) {
                    anim.start();
                    flag = true;
                } else {
                    anim.stop();
                    flag = false;
                }
            }
        });

4.积累:在Manifest设置Activity为横屏

screenOritation:landscape
补间动画

1.在新目录anim中定义动画资源xml,
四个

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:toAlpha="1"
        android:fromAlpha="0"
        android:duration="2000" />
</set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="2000" />
</set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:fromXScale="1"
        android:fromYScale="1"
        android:toXScale="2"
        android:toYScale="2"
        android:pivotY="50%"
        android:pivotX="50%"
        android:duration="2000"
        />
</set>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="300"
        android:toYDelta="300"
        android:duration="2000"
        />


</set>

2.主界面imageView显示一张图片

<ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView"
        android:src="@drawable/gao"
        />

3.添加点击事件,为imageView应用动画

        final ImageView imageView = findViewById(R.id.imageView);
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Animation alpha= AnimationUtils.loadAnimation(MainActivity.this, R.anim.apha);
                Animation rotate= AnimationUtils.loadAnimation(MainActivity.this, R.anim.rotate);
                Animation scale= AnimationUtils.loadAnimation(MainActivity.this, R.anim.scale);
                Animation traslate= AnimationUtils.loadAnimation(MainActivity.this, R.anim.translate);
                imageView.startAnimation(traslate);
            }
        });
设置滑动图片的补间动画效果

1.界面

<ViewFlipper
        android:id="@+id/flipper"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ViewFlipper>

2.fadein和fadeout动画

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="1"
        android:toAlpha="0"
        android:duration="4000"/>

</set>

3.给ViewFlipper添加图片和动画



public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener {

    ViewFlipper flipper;
    GestureDetector detector = new GestureDetector(this, this);
    final int distance = 50;//手势动作两点最小距离
    int[] image = new int[]{
            R.drawable.gao, R.drawable.yun
    };
    Animation fade_in = AnimationUtils.loadAnimation(this, R.anim.fade_in);
    Animation fade_out = AnimationUtils.loadAnimation(this, R.anim.fade_out);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        flipper = findViewById(R.id.flipper);
        for (int i = 0; i < image.length; i++) {
            ImageView imageView = new ImageView(this);
            imageView.setImageResource(image[i]);
            flipper.addView(imageView);
        }


//        flipper.setInAnimation(fade_in);
//        flipper.setOutAnimation(fade_out);

//        final ImageView imageView = findViewById(R.id.imageView);
//        imageView.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View view) {
//                Animation alpha= AnimationUtils.loadAnimation(MainActivity.this, R.anim.apha);
//                Animation rotate= AnimationUtils.loadAnimation(MainActivity.this, R.anim.rotate);
//                Animation scale= AnimationUtils.loadAnimation(MainActivity.this, R.anim.scale);
//                Animation traslate= AnimationUtils.loadAnimation(MainActivity.this, R.anim.translate);
//                imageView.startAnimation(scale);
//            }
//        });

    }

    @Override
    public boolean onDown(MotionEvent motionEvent) {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent motionEvent) {

    }

    @Override
    public boolean onSingleTapUp(MotionEvent motionEvent) {
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
        return false;
    }

    @Override
    public void onLongPress(MotionEvent motionEvent) {

    }

    @Override
    public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
        if (motionEvent.getX() - motionEvent1.getX() > distance) {
            flipper.setInAnimation(fade_in);
            flipper.setOutAnimation(fade_out);
            flipper.showPrevious();
            return true;
        } else {
            flipper.setInAnimation(fade_in);
            flipper.setOutAnimation(fade_out);
            flipper.showNext();
            return true;
        }
    }



    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return detector.onTouchEvent(event);
        //将该Activity上的触碰事件交给GestureDetector处理
    }
}

多媒体应用开发

MediaPlayer

在这里插入图片描述

在这里插入图片描述

 boolean flag = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.carmen);


        Button playOrPause = findViewById(R.id.playOrPause);
       // Button pause = findViewById(R.id.pause);
        Button stop = findViewById(R.id.stop);

        playOrPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (flag==false) {
                    mediaPlayer.start();
                    flag = true;
                }else {
                    mediaPlayer.pause();
                    flag=false;
                }
            }
        });

        /*pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mediaPlayer.pause();
            }
        });*/

        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mediaPlayer.stop();

            }
        });
SoundPool

在这里插入图片描述

1.界面布局

		<ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/bell"></ListView>
<resources>
    <array name="bell">
        <item >song1</item>
        <item>song2</item>
    </array>
</resources>

2.监听器事件

       ListView listView = findViewById(R.id.listView);

        AudioAttributes attr = new AudioAttributes.Builder() //音效
                .setUsage(AudioAttributes.USAGE_MEDIA)//设置音效使用场景
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)//设置音效类型
                .build();//别忘了

        final SoundPool soundPool = new SoundPool.Builder()
                .setAudioAttributes(attr)//应用音效
                .setMaxStreams(3) //音效池最大音频数
                .build();

        final HashMap<Integer, Integer> soundMap = new HashMap<>();
        soundMap.put(0, soundPool.load(this, R.raw.carmen, 1));
        soundMap.put(1, soundPool.load(this, R.raw.meditation, 1));
        //将要播放的音频跑存到HashMap中


        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                soundPool.play(soundMap.get(i), 1, 1,
                        0, 0, 1);

            }
        });//点击item触发事件监听器
        
播放视频

在这里插入图片描述

拍照和视频

在这里插入图片描述
在这里插入图片描述

数据存储

在这里插入图片描述

SharedPreferences

在这里插入图片描述
在这里插入图片描述
1.布局文件

<EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/user"/>
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/password"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/login"
        android:text="登录"/>

2.添加事件

		final EditText editText1 = findViewById(R.id.user);
        final EditText editText2 = findViewById(R.id.password);
        Button login = findViewById(R.id.login);

        final SharedPreferences sp = getSharedPreferences("gao", MODE_PRIVATE);
                                                        //sp文件名
        String userName = sp.getString("username", null);
        String passWord = sp.getString("password", null);

        if (userName != null && passWord != null) {//之前登陆过,有sp文件的情况下,自动登录
            if (userName.equals("ouyang") && passWord.equals("gao")) {
                Intent intent = new Intent(MainActivity.this, Main2Activity.class);
                startActivity(intent);
            }else
                Toast.makeText(MainActivity.this,"错误",Toast.LENGTH_SHORT).show();

        } else { //第一次登陆
            login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String inname = editText1.getText().toString();
                    String inpass = editText2.getText().toString();
                    
                    SharedPreferences.Editor editor = sp.edit();
                    if (inname.equals("ouyang") && inpass.equals("gao")) { //密码与服务器上的一致
                        
                        editor.putString("username", inname);
                        editor.putString("password", inpass);
                        editor.commit();
                        //保存到sp文件中

                        Intent intent = new Intent(MainActivity.this, MainActivity.class);
                        startActivity(intent);
                        Toast.makeText(MainActivity.this, "已保存", Toast.LENGTH_SHORT).show();

                    }else
                        Toast.makeText(MainActivity.this, "账号或密码错误", Toast.LENGTH_SHORT).show();
                            
                }
            });
内外部存储

在这里插入图片描述

ContentProvider

消息传递

在这里插入图片描述
在这里插入图片描述

Message实现banner

1.界面

    <ViewFlipper
        android:id="@+id/viewFlipper"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >

    </ViewFlipper>

2.添加图片和动画资源,内部类定义handler,并发送一个消息

public class MainActivity extends AppCompatActivity {


    private static final int FLAG_MSG =0x001 ;
    int[] images = new int[]{
            R.drawable.yun,R.drawable.gao,R.drawable.img1
    };
    private ViewFlipper viewFlipper;
    private Message message;



    Handler handler = new Handler(){//定义全局对象并如何处理消息
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            if (msg.what == FLAG_MSG) {
                viewFlipper.showPrevious();
                message = handler.obtainMessage(FLAG_MSG);
                handler.sendMessageDelayed(message, 3000);
                //三秒后handler再次发送消息
            }
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewFlipper = findViewById(R.id.viewFlipper);
        for (int i = 0; i < images.length; i++) {
            ImageView imageView = new ImageView(this);
            imageView.setImageResource(images[i]);
            viewFlipper.addView(imageView);
        }
        Animation in = AnimationUtils.loadAnimation(this, R.anim.fade_in);
        Animation out = AnimationUtils.loadAnimation(this, R.anim.fade_out);

        viewFlipper.setInAnimation(in);
        viewFlipper.setOutAnimation(out);


        message = Message.obtain();//获得消息对象
        message.what = FLAG_MSG;//设置消息代码
        handler.sendMessage(message);//handler发送消息
    }



}
handler实现倒计时进度条

1.布局

 <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="match_parent"
        android:layout_height="10dp"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:max="60"
        />

2.handler发送消息

    private ProgressBar timer;
    int time=60;
    private int TIMER_MSG=0x001;
    Handler handler=new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            if (time > 0) {
                time--;
                timer.setProgress(time);
                handler.sendEmptyMessageDelayed(TIMER_MSG, 1000);
                //每隔一秒发送001代码的消息
            } else {
                Toast.makeText(MainActivity.this,"time up",Toast.LENGTH_SHORT).show();
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        timer = findViewById(R.id.progressBar);
        handler.sendEmptyMessage(TIMER_MSG);

service

boundService

在这里插入图片描述

IntentService

![在这里插入图片描述](https://img-blog.csdnimg.cn/20191017104025480.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDM1OTM0OQ =在这里插入图片描述500x300,size_1,color_FFFFFF,t_70)

定位与地图

获取经纬度

![在这里插入图片描述](https://img-blog.csdnimg.cn/2019101712393599.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDM1OTM0OQ#pic_center =500x300,size_1,color_FFFFFF,t_70)

   protected void onCreate(Bundle savedInstanceState) {
	  super.onCreate(savedInstanceState);
	  setContentView(R.layout.activity_main);

	  text = findViewById(R.id.textView);

	  if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
		 // TODO: Consider calling
		 //    Activity#requestPermissions
		 // here to request the missing permissions, and then overriding
		 //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
		 //                                          int[] grantResults)
		 // to handle the case where the user grants the permission. See the documentation
		 // for Activity#requestPermissions for more details.
		 return;
	  }

	  LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
	  Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
	  locationUpdates(location);

	  locationManager.requestLocationUpdates(
	  		LocationManager.GPS_PROVIDER,
			  1000,//一秒更新一次
			  1,//一米更新
			   new LocationListener() {
				 @Override
				 public void onLocationChanged(Location location) {

				 }

				 @Override
				 public void onStatusChanged(String s, int i, Bundle bundle) {

				 }

				 @Override
				 public void onProviderEnabled(String s) {

				 }

				 @Override
				 public void onProviderDisabled(String s) {

				 }
			  });

   }

   private void locationUpdates(Location location) {
	  if (location != null) {
		 StringBuilder stringBuilder = new StringBuilder();
		 stringBuilder.append("经度" + location.getLongitude() + "\n");
		 stringBuilder.append("纬度" + location.getLatitude() + "\n");
		 stringBuilder.append("海拔" + location.getAltitude() + "\n");

		 text.setText(stringBuilder.toString());
	  }else
	     Toast.makeText(MainActivity.this,"没有GPS信号", Toast.LENGTH_SHORT).show();
   }
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
百度地图API开发地图

1.开发者秘钥
C:\Users\Administrator.android 找到key.store文件
cmd命令:
keytool -list -v -keystore debug.keystore
( keytool 是Java 提供的一个关于鉴权的命令 ,使用这个命令的话,要定位到JAVA 的bin 目录下)
复制文件到java/bin
cmd:
C:\Program Files\Java\jdk1.8.0_211\bin>keytool -list -v -keystore debug.keystore
秘钥库口令直接回车
得到sha1,复制到申请的网站
2.下载百度LBS Android SDK
3.配置百度LBS Android SDK
a.Project模式—>
b.libs中放入解压缩的SDK libs目录下的jar文件—>
c.选中这两个文件,右键添加到库
d.src.main目录下新建目录:JNIlibs
e.SDK libs目录下armiabi目录放入JNIlibs目录
f.appplication标记中(第一个Activity标记前)添加秘钥

<meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="kMyHIRxSv3bcUYR22EKS6Qr3TnDLGsAk" />
	g.添加权限
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

4.布局

<com.baidu.mapapi.map.MapView
        android:id="@+id/mapview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"/>

5.初始化地图SDK,管理地图生命周期

	private MapView mapView;

   /**
	* 地图生命周期
	*/
   @Override
   protected void onResume() {
	  super.onResume();
	  mapView.onResume();
   }

   @Override
   protected void onPause() {
	  super.onPause();
	  mapView.onPause();
   }

   @Override
   protected void onDestroy() {
	  super.onDestroy();
	  mapView.onDestroy();
	  mapView = null;
   }

   @Override
   protected void onCreate(Bundle savedInstanceState) {
	  super.onCreate(savedInstanceState);


	  SDKInitializer.initialize(getApplicationContext());
	  //初始化地图SDk,在布局文件之前
	  setContentView(R.layout.activity_main);


	  /**
	   * 百度地图API
	   *
	   */
	  mapView = findViewById(R.id.mapview);
百度地图API定位到自己位置

以下是看的源码

package com.example.location;


import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;

public class MainActivity extends AppCompatActivity {

   private MapView mMapView;     // 定义百度地图组件
   private BaiduMap mBaiduMap;   // 定义百度地图对象
   private LocationClient mLocationClient;  //定义LocationClient
   private BDLocationListener myListener = new MyLocationListener();  //定义位置监听
   private boolean isFirstLoc = true;  //定义第一次启动
   private MyLocationConfiguration.LocationMode mCurrentMode;  //定义当前定位模式

   @Override
   protected void onCreate(Bundle savedInstanceState) {
	  super.onCreate(savedInstanceState);
	  SDKInitializer.initialize(getApplicationContext());   //初始化地图SDK
	  setContentView(R.layout.activity_main);
	  mMapView = (MapView) findViewById(R.id.mapview);  //获取地图组件
	  mBaiduMap = mMapView.getMap();  //获取百度地图对象
	  mLocationClient = new LocationClient(getApplicationContext());  //创建LocationClient类
	  mLocationClient.registerLocationListener(myListener);   //注册监听函数
	  initLocation();  //调用initLocation()方法,实现初始化定位
   }

   private void initLocation() {  //该方法实现初始化定位
	  //创建LocationClientOption对象,用于设置定位方式
	  LocationClientOption option = new LocationClientOption();
	  option.setCoorType("bd09ll");  //设置坐标类型
	  option.setScanSpan(1000);      //1秒定位一次
	  option.setOpenGps(true);      //打开GPS
	  mLocationClient.setLocOption(option);  //保存定位参数与信息
	  mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;  //设置定位模式
	  //设置自定义定位图标
	  BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
			  .fromResource(R.drawable.ic_launcher_background);
	  //位置构造方式,将定位模式,定义图标添加其中
	  MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);
	  mBaiduMap.setMyLocationConfigeration(config);  //地图显示定位图标
   }

   public class MyLocationListener implements BDLocationListener {  //设置定位监听器
	  @Override
	  public void onReceiveLocation(BDLocation location) {
		 //销毁后不再处理新接收的位置
		 if (location == null || mMapView == null)
			return;
		 // 构造定位数据
		 MyLocationData locData = new MyLocationData.Builder()
				 .accuracy(location.getRadius())
				 // 此处设置开发者获取到的方向信息,顺时针0-360
				 .direction(100)
				 .latitude(location.getLatitude())
				 .longitude(location.getLongitude())
				 .build();
		 // 设置定位数据
		 mBaiduMap.setMyLocationData(locData);

		 if (isFirstLoc) {  //如果是第一次定位,就定位到以自己为中心
			LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); //获取用户当前经纬度
			MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);  //更新坐标位置
			mBaiduMap.animateMapStatus(u);                            //设置地图位置
			isFirstLoc = false;                                      //取消第一次定位
		 }

	  }
   }


   @Override
   protected void onStart() {  //地图定位与Activity生命周期绑定
	  super.onStart();
	  mBaiduMap.setMyLocationEnabled(true);
	  mLocationClient.start();
   }


   @Override
   protected void onStop() {  //停止地图定位
	  super.onStop();
	  mBaiduMap.setMyLocationEnabled(false);
	  mLocationClient.stop();
   }

   @Override
   protected void onResume() {
	  super.onResume();
	  mMapView.onResume();
   }

   @Override
   protected void onPause() {
	  super.onPause();
	  mMapView.onPause();
   }


   @Override
   protected void onDestroy() {  //销毁地图
	  mMapView.onDestroy();
	  mMapView = null;
	  super.onDestroy();
   }


}

以下是跟着敲得代码



public class beifen extends AppCompatActivity {


   private MapView mapView;

   private BaiduMap baiduMap;
   private boolean isFirstLoc = true;
   private MyLocationConfiguration.LocationMode locationMode;

   private void locationUpdates(Location location) {



	  MyLocationData locData=new MyLocationData.Builder()
				 .accuracy(location.getAccuracy())
				 .direction(100)
				 .latitude(location.getLatitude())
				 .longitude(location.getLongitude())
				 .build();
	  baiduMap.setMyLocationData(locData);//构造定位数据



	  BitmapDescriptor bitMap= BitmapDescriptorFactory
				 .fromResource(R.drawable.ic_launcher_background);
	  locationMode = MyLocationConfiguration.LocationMode.NORMAL;
	  MyLocationConfiguration config=new MyLocationConfiguration(
				 locationMode,true,bitMap
		 );
	  baiduMap.setMyLocationConfiguration(config);//构造定位配置:模式,bitmap




	  if (location != null) {
		 LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
		 //获取当前经纬度
		 Log.i("location", "纬度:" + location.getLatitude() +
				 "\n" + "经度:" + location.getLongitude());
		 if (isFirstLoc) {
			MapStatusUpdate statusUpdate = MapStatusUpdateFactory.newLatLng(latLng);
			baiduMap.animateMapStatus(statusUpdate);
			isFirstLoc = false;
		 }
	  }else
		 Log.i("location", "NOGPS");
   }//upDate 方法结束





   @Override
   protected void onStart() {
	  super.onStart();
	  baiduMap.setMyLocationEnabled(true);//开启定位图层
   }

   @Override
   protected void onStop() {
	  super.onStop();
	  baiduMap.setMyLocationEnabled(false);//关闭定位图层
   }

   /**
	* 地图生命周期
	*/

   @Override
   protected void onResume() {
	  super.onResume();
	  mapView.onResume();
   }

   @Override
   protected void onPause() {
	  super.onPause();
	  mapView.onPause();
   }

   @Override
   protected void onDestroy() {
	  super.onDestroy();
	  mapView.onDestroy();
	  mapView = null;
   }

   @Override
   protected void onCreate(Bundle savedInstanceState) {
	  super.onCreate(savedInstanceState);


	  SDKInitializer.initialize(getApplicationContext());
	  //初始化地图SDk,在布局文件之前
	  setContentView(R.layout.activity_main);


	  /**
	   * 百度地图API
	   *
	   */
	  LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
	  if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
		 // TODO: Consider calling
		 //    Activity#requestPermissions
		 // here to request the missing permissions, and then overriding
		 //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
		 //                                          int[] grantResults)
		 // to handle the case where the user grants the permission. See the documentation
		 // for Activity#requestPermissions for more details.
		 return;
	  }//权限检查,alt+enter出来的


	  mapView = findViewById(R.id.mapview);
	  baiduMap = mapView.getMap();
	  lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,
			  1000,
			  1,
			  new LocationListener() {

				 @Override
				 public void onLocationChanged(Location location) {
					locationUpdates(location);
				 }

				 @Override
				 public void onStatusChanged(String s, int i, Bundle bundle) {

				 }

				 @Override
				 public void onProviderEnabled(String s) {

				 }

				 @Override
				 public void onProviderDisabled(String s) {

				 }
			  });
	  Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
	  locationUpdates(location);//将最新的locaiton传给该方法


   }}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值