@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -1,36 +0,0 @@
|
|||||||
package com.example.myapplication;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.preference.EditTextPreference;
|
|
||||||
import android.preference.Preference;
|
|
||||||
import android.preference.Preference.OnPreferenceChangeListener;
|
|
||||||
import android.preference.PreferenceActivity;
|
|
||||||
import android.view.Window;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 听写设置界面
|
|
||||||
*/
|
|
||||||
public class IatSettings extends PreferenceActivity implements OnPreferenceChangeListener {
|
|
||||||
|
|
||||||
public static final String PREFER_NAME = "com.inflater.setting";
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
getPreferenceManager().setSharedPreferencesName(PREFER_NAME);
|
|
||||||
addPreferencesFromResource(R.xml.iat_setting);
|
|
||||||
|
|
||||||
EditTextPreference mVadbosPreference = (EditTextPreference) findPreference("iat_vadbos_preference");
|
|
||||||
mVadbosPreference.getEditText().addTextChangedListener(new SettingTextWatcher(IatSettings.this, mVadbosPreference, 0, 10000));
|
|
||||||
|
|
||||||
EditTextPreference mVadeosPreference = (EditTextPreference) findPreference("iat_vadeos_preference");
|
|
||||||
mVadeosPreference.getEditText().addTextChangedListener(new SettingTextWatcher(IatSettings.this, mVadeosPreference, 0, 10000));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,71 +0,0 @@
|
|||||||
package com.example.myapplication;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.preference.EditTextPreference;
|
|
||||||
import android.text.Editable;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.text.TextWatcher;
|
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 输入框输入范围控制
|
|
||||||
*/
|
|
||||||
public class SettingTextWatcher implements TextWatcher {
|
|
||||||
private int editStart;
|
|
||||||
private int editCount;
|
|
||||||
private EditTextPreference mEditTextPreference;
|
|
||||||
int minValue;//最小值
|
|
||||||
int maxValue;//最大值
|
|
||||||
private Context mContext;
|
|
||||||
|
|
||||||
public SettingTextWatcher(Context context, EditTextPreference e, int min, int max) {
|
|
||||||
mContext = context;
|
|
||||||
mEditTextPreference = e;
|
|
||||||
minValue = min;
|
|
||||||
maxValue = max;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
|
||||||
// Log.e("demo", "onTextChanged start:"+start+" count:"+count+" before:"+before);
|
|
||||||
editStart = start;
|
|
||||||
editCount = count;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
|
||||||
// Log.e("demo", "beforeTextChanged start:"+start+" count:"+count+" after:"+after);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void afterTextChanged(Editable s) {
|
|
||||||
if (TextUtils.isEmpty(s)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
String content = s.toString();
|
|
||||||
// Log.e("demo", "content:"+content);
|
|
||||||
if (isNumeric(content)) {
|
|
||||||
int num = Integer.parseInt(content);
|
|
||||||
if (num > maxValue || num < minValue) {
|
|
||||||
s.delete(editStart, editStart + editCount);
|
|
||||||
mEditTextPreference.getEditText().setText(s);
|
|
||||||
Toast.makeText(mContext, "超出有效值范围", Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
s.delete(editStart, editStart + editCount);
|
|
||||||
mEditTextPreference.getEditText().setText(s);
|
|
||||||
Toast.makeText(mContext, "只能输入数字哦", Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 正则表达式-判断是否为数字
|
|
||||||
*/
|
|
||||||
public static boolean isNumeric(String str) {
|
|
||||||
Pattern pattern = Pattern.compile("[0-9]*");
|
|
||||||
return pattern.matcher(str).matches();
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
@ -0,0 +1,224 @@
|
|||||||
|
package com.example.myapplication;
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.Button;
|
||||||
|
|
||||||
|
import com.baidu.mapapi.bikenavi.BikeNavigateHelper;
|
||||||
|
import com.baidu.mapapi.walknavi.adapter.IWRoutePlanListener;
|
||||||
|
import com.baidu.mapapi.walknavi.model.WalkRoutePlanError;
|
||||||
|
import com.baidu.mapapi.walknavi.params.*;
|
||||||
|
import com.baidu.mapapi.CoordType;
|
||||||
|
import com.baidu.mapapi.SDKInitializer;
|
||||||
|
import com.baidu.mapapi.model.LatLng;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import android.widget.ImageButton;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import com.baidu.baidunavis.BaiduNaviParams;
|
||||||
|
import com.baidu.mapapi.SDKInitializer;
|
||||||
|
import com.baidu.mapapi.map.MapView;
|
||||||
|
import com.baidu.mapapi.model.LatLng;
|
||||||
|
import com.baidu.mapapi.walknavi.WalkNavigateHelper;
|
||||||
|
import com.baidu.mapapi.walknavi.adapter.IWEngineInitListener;
|
||||||
|
import com.baidu.mapapi.walknavi.params.WalkNaviLaunchParam;
|
||||||
|
|
||||||
|
public class itemfound extends AppCompatActivity {
|
||||||
|
private WalkNavigateHelper helper = null;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
//initPermissions(); // 初始化权限
|
||||||
|
setContentView(R.layout.activity_itemfound); // 填充视图
|
||||||
|
|
||||||
|
// 点击按钮开始导航
|
||||||
|
Button imageButton = findViewById(R.id.button_item_keys);
|
||||||
|
imageButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
// 初始化步行导航
|
||||||
|
startBikeNavi();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Button imageButtonwallet = findViewById(R.id.button_item_wallet);
|
||||||
|
imageButtonwallet.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
// 初始化步行导航
|
||||||
|
startBikeNavi();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// 初始化权限
|
||||||
|
/*
|
||||||
|
private void initPermissions() {
|
||||||
|
if (Build.VERSION.SDK_INT >= 23) {
|
||||||
|
ArrayList<String> permissionsList = new ArrayList<>();
|
||||||
|
String[] permissions = {
|
||||||
|
Manifest.permission.ACCESS_NETWORK_STATE,
|
||||||
|
Manifest.permission.INTERNET,
|
||||||
|
Manifest.permission.ACCESS_COARSE_LOCATION,
|
||||||
|
Manifest.permission.ACCESS_FINE_LOCATION,
|
||||||
|
Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||||
|
};
|
||||||
|
|
||||||
|
for (String perm : permissions) {
|
||||||
|
if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(perm)) {
|
||||||
|
permissionsList.add(perm);
|
||||||
|
// 进入到这里代表没有权限.
|
||||||
|
}
|
||||||
|
if (!permissionsList.isEmpty()) {
|
||||||
|
String[] strings = new String[permissionsList.size()];
|
||||||
|
requestPermissions(permissionsList.toArray(strings), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
private void startBikeNavi() {
|
||||||
|
//Log.d("=========", "startBikeNavi");
|
||||||
|
try {
|
||||||
|
helper = WalkNavigateHelper.getInstance();
|
||||||
|
helper.initNaviEngine(this, new IWEngineInitListener() {
|
||||||
|
@Override
|
||||||
|
public void engineInitSuccess() {
|
||||||
|
// Log.d("=========", "BikeNavi engineInitSuccess引擎初始化成功");
|
||||||
|
startWebNavi();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void engineInitFail() {
|
||||||
|
// Log.d("=========", "BikeNavi engineInitFail");
|
||||||
|
BikeNavigateHelper.getInstance().unInitNaviEngine();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Log.d("=========", "startBikeNavi Exception");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void startWebNavi() {
|
||||||
|
//起终点位置
|
||||||
|
LatLng walkStartNode = new LatLng(39.110132, 117.358512);
|
||||||
|
LatLng walkEndNode = new LatLng(39.111348, 117.358940);
|
||||||
|
|
||||||
|
WalkRouteNodeInfo startNode = new WalkRouteNodeInfo();
|
||||||
|
startNode.setLocation(walkStartNode);
|
||||||
|
WalkRouteNodeInfo endNode = new WalkRouteNodeInfo();
|
||||||
|
endNode.setLocation(walkEndNode);
|
||||||
|
// 官网
|
||||||
|
//构造WalkNaviLaunchParam
|
||||||
|
WalkNaviLaunchParam walkParam = new WalkNaviLaunchParam().startNodeInfo(startNode).endNodeInfo(endNode);
|
||||||
|
//获取WalkNavigateHelper实例 //发起算路
|
||||||
|
helper.routePlanWithRouteNode(walkParam, new IWRoutePlanListener() {
|
||||||
|
@Override
|
||||||
|
public void onRoutePlanStart() {
|
||||||
|
// Log.d("=======", "WalkNavi onRoutePlanStart开始步行导航");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRoutePlanSuccess() {
|
||||||
|
// Log.d("========", "onRoutePlanSuccess算路成功");
|
||||||
|
Intent intent = new Intent(itemfound.this,WNaviGuideActivity.class);
|
||||||
|
// intent.setClass(getContext(), WNaviGuideActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRoutePlanFail(WalkRoutePlanError error) {
|
||||||
|
// Log.d("Walk", "WalkNavi onRoutePlanFail");
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_itemfound);
|
||||||
|
Button find_wallet=findViewById(R.id.button_item_wallet);
|
||||||
|
Button find_keys=findViewById(R.id.button_item_keys);
|
||||||
|
find_wallet.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {//Intent
|
||||||
|
double locationX;
|
||||||
|
double locationy;
|
||||||
|
//BaiduMapNavigation
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
find_keys.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {//Intent
|
||||||
|
//NaviParaOption para=new Navi();
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}*/ private void startBikeNavi1() {
|
||||||
|
//Log.d("=========", "startBikeNavi");
|
||||||
|
try {
|
||||||
|
helper = WalkNavigateHelper.getInstance();
|
||||||
|
helper.initNaviEngine(this, new IWEngineInitListener() {
|
||||||
|
@Override
|
||||||
|
public void engineInitSuccess() {
|
||||||
|
// Log.d("=========", "BikeNavi engineInitSuccess引擎初始化成功");
|
||||||
|
startWebNavi1();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void engineInitFail() {
|
||||||
|
// Log.d("=========", "BikeNavi engineInitFail");
|
||||||
|
BikeNavigateHelper.getInstance().unInitNaviEngine();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Log.d("=========", "startBikeNavi Exception");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void startWebNavi1() {
|
||||||
|
//起终点位置
|
||||||
|
LatLng walkStartNode = new LatLng(39.110132, 117.358512);
|
||||||
|
LatLng walkEndNode = new LatLng(39.112286, 117.359619);
|
||||||
|
|
||||||
|
WalkRouteNodeInfo startNode = new WalkRouteNodeInfo();
|
||||||
|
startNode.setLocation(walkStartNode);
|
||||||
|
WalkRouteNodeInfo endNode = new WalkRouteNodeInfo();
|
||||||
|
endNode.setLocation(walkEndNode);
|
||||||
|
// 官网
|
||||||
|
//构造WalkNaviLaunchParam
|
||||||
|
WalkNaviLaunchParam walkParam = new WalkNaviLaunchParam().startNodeInfo(startNode).endNodeInfo(endNode);
|
||||||
|
//获取WalkNavigateHelper实例 //发起算路
|
||||||
|
helper.routePlanWithRouteNode(walkParam, new IWRoutePlanListener() {
|
||||||
|
@Override
|
||||||
|
public void onRoutePlanStart() {
|
||||||
|
// Log.d("=======", "WalkNavi onRoutePlanStart开始步行导航");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRoutePlanSuccess() {
|
||||||
|
// Log.d("========", "onRoutePlanSuccess算路成功");
|
||||||
|
Intent intent = new Intent(itemfound.this,WNaviGuideActivity.class);
|
||||||
|
// intent.setClass(getContext(), WNaviGuideActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRoutePlanFail(WalkRoutePlanError error) {
|
||||||
|
// Log.d("Walk", "WalkNavi onRoutePlanFail");
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package com.example.myapplication.weather;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
|
|
||||||
|
public class DatabaseHelper extends SQLiteOpenHelper {
|
||||||
|
private static final int VERSION = 1;
|
||||||
|
private static final String NAME = "weather";
|
||||||
|
|
||||||
|
public DatabaseHelper(Context context){
|
||||||
|
super(context,NAME,null,VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(SQLiteDatabase db) {
|
||||||
|
db.execSQL("create table weather (_id INTEGER PRIMARY KEY AUTOINCREMENT,date text,max_temp text,min_temp text,text text,humidity text,pressure text,wind text,icon text)");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package com.example.myapplication.weather;
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
|
||||||
|
import com.example.myapplication.R;
|
||||||
|
import com.example.myapplication.weather.SingleFragmentActivity;
|
||||||
|
import com.example.myapplication.weather.WeatherFragment;
|
||||||
|
|
||||||
|
public class MainActivity1 extends SingleFragmentActivity implements WeatherFragment.Callbacks{
|
||||||
|
@Override
|
||||||
|
protected Fragment createFragment() {
|
||||||
|
return WeatherFragment.newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getLayoutId() {
|
||||||
|
return R.layout.activity_masterdetail;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getFragmentId() {
|
||||||
|
return R.id.fragment_container;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onWeatherSelected(WeatherItem weatherItem){ //平板中选中天气
|
||||||
|
if(findViewById(R.id.detail_container)==null){
|
||||||
|
Intent intent = WeatherDetailActivity.newIntent(this,weatherItem);
|
||||||
|
startActivity(intent);
|
||||||
|
}else{
|
||||||
|
Fragment newDetail = WeatherDetailFragment.newInstance(weatherItem);
|
||||||
|
getSupportFragmentManager().beginTransaction()
|
||||||
|
.replace(R.id.detail_container,newDetail)
|
||||||
|
.commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,95 @@
|
|||||||
|
package com.example.myapplication.weather;
|
||||||
|
|
||||||
|
import android.app.AlarmManager;
|
||||||
|
import android.app.IntentService;
|
||||||
|
import android.app.Notification;
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.SystemClock;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
|
||||||
|
import com.example.myapplication.R;
|
||||||
|
import com.example.myapplication.weather.WeatherFragment;
|
||||||
|
|
||||||
|
public class NotificationService extends IntentService {
|
||||||
|
private static final String TAG = "NotificationService";
|
||||||
|
|
||||||
|
private static final int NOTIFICATION_INTERVAL = 1000*60;
|
||||||
|
|
||||||
|
public static Intent newIntent(Context context){
|
||||||
|
return new Intent(context,NotificationService.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public NotificationService(){
|
||||||
|
super(TAG);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onHandleIntent(@Nullable Intent intent) {
|
||||||
|
Log.i(TAG,"Intent there");
|
||||||
|
|
||||||
|
Intent i = WeatherFragment.newIntent(this);
|
||||||
|
PendingIntent pi = PendingIntent.getService(this,0,i,0);
|
||||||
|
|
||||||
|
Notification notification = null;
|
||||||
|
SharedPreferences pref = this.getSharedPreferences("setting",Context.MODE_PRIVATE);
|
||||||
|
String unit = pref.getString("unit","摄氏度");
|
||||||
|
String unit_text = "°";
|
||||||
|
if (unit == "华氏度"){
|
||||||
|
unit_text = "℉";
|
||||||
|
}
|
||||||
|
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
|
||||||
|
.setTicker("ticker")
|
||||||
|
.setSmallIcon(R.drawable.a100)
|
||||||
|
.setContentTitle("今日天气")
|
||||||
|
.setContentText(pref.getString("city","北京")+
|
||||||
|
" 天气:"+pref.getString("text","")+
|
||||||
|
", 最高温度:"+pref.getString("max_temp","")+unit_text+
|
||||||
|
", 最低温度:"+pref.getString("min_temp","")+unit_text)
|
||||||
|
.setContentIntent(pi)
|
||||||
|
.setAutoCancel(true);
|
||||||
|
|
||||||
|
NotificationManager notificationManager =(NotificationManager)
|
||||||
|
getSystemService(NOTIFICATION_SERVICE);
|
||||||
|
|
||||||
|
//一定要设置channel
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
NotificationChannel channel = new NotificationChannel("to-do"
|
||||||
|
, "待办消息",
|
||||||
|
NotificationManager.IMPORTANCE_HIGH);
|
||||||
|
channel.enableVibration(true);
|
||||||
|
channel.setVibrationPattern(new long[]{500});
|
||||||
|
notificationManager.createNotificationChannel(channel);
|
||||||
|
builder.setChannelId("to-do");
|
||||||
|
notification = builder.build();
|
||||||
|
} else {
|
||||||
|
notification = builder.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
notificationManager.notify(0,notification);
|
||||||
|
System.out.println(notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setServiceAlarm(Context context,boolean isOn){
|
||||||
|
Intent i = NotificationService.newIntent(context);
|
||||||
|
PendingIntent pi = PendingIntent.getService(context,0,i,0);
|
||||||
|
|
||||||
|
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
||||||
|
|
||||||
|
if(isOn){
|
||||||
|
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(),
|
||||||
|
NOTIFICATION_INTERVAL,pi);
|
||||||
|
}else{
|
||||||
|
alarmManager.cancel(pi);
|
||||||
|
pi.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,132 @@
|
|||||||
|
package com.example.myapplication.weather;
|
||||||
|
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.text.Editable;
|
||||||
|
import android.text.TextWatcher;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
|
import com.example.myapplication.R;
|
||||||
|
|
||||||
|
public class SettingActivity extends AppCompatActivity {
|
||||||
|
private EditText location;
|
||||||
|
private TextView unit_text;
|
||||||
|
private TextView send_text;
|
||||||
|
private LinearLayout page;
|
||||||
|
private LinearLayout unit;
|
||||||
|
private LinearLayout send;
|
||||||
|
private String city;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_setting);
|
||||||
|
|
||||||
|
location = (EditText) findViewById(R.id.location);
|
||||||
|
unit = (LinearLayout)findViewById(R.id.unit);
|
||||||
|
page = (LinearLayout)findViewById(R.id.page);
|
||||||
|
unit_text = (TextView)findViewById(R.id.unit_text);
|
||||||
|
send = (LinearLayout)findViewById(R.id.send);
|
||||||
|
send_text = (TextView)findViewById(R.id.send_text);
|
||||||
|
|
||||||
|
SharedPreferences pref = getSharedPreferences("setting",MODE_PRIVATE);
|
||||||
|
location.setText(pref.getString("city","北京"));
|
||||||
|
unit_text.setText(pref.getString("unit","摄氏度"));
|
||||||
|
send_text.setText(pref.getString("send","是"));
|
||||||
|
|
||||||
|
page.setOnClickListener(new View.OnClickListener(){
|
||||||
|
public void onClick(View v){
|
||||||
|
location.clearFocus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
location.addTextChangedListener(new TextWatcher() {
|
||||||
|
@Override
|
||||||
|
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||||
|
city = s.toString();
|
||||||
|
SharedPreferences.Editor editor = getSharedPreferences("setting",MODE_PRIVATE).edit();
|
||||||
|
editor.putString("city",city);
|
||||||
|
editor.commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterTextChanged(Editable s) {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
unit.setOnClickListener(new View.OnClickListener(){
|
||||||
|
public void onClick(View v){
|
||||||
|
click();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
send.setOnClickListener(new View.OnClickListener(){
|
||||||
|
public void onClick(View v){
|
||||||
|
click2();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//点击按钮弹出一个单选对话框
|
||||||
|
public void click() {
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||||
|
builder.setTitle("请选择温度单位");
|
||||||
|
final String items[] = {"摄氏度","华氏度"};
|
||||||
|
|
||||||
|
//-1代表没有条目被选中
|
||||||
|
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
//1.把选中的条目取出来
|
||||||
|
String item = items[which];
|
||||||
|
Toast.makeText(getApplicationContext(),item.toString(),Toast.LENGTH_LONG).show();
|
||||||
|
unit_text.setText(item.toString());
|
||||||
|
SharedPreferences.Editor editor = getSharedPreferences("setting",MODE_PRIVATE).edit();
|
||||||
|
editor.putString("unit",item.toString());
|
||||||
|
editor.commit();
|
||||||
|
//2.然后把对话框关闭
|
||||||
|
dialog.dismiss();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//一样要show
|
||||||
|
builder.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void click2() {
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||||
|
builder.setTitle("请选择是否开启通知");
|
||||||
|
final String items[] = {"是","否"};
|
||||||
|
|
||||||
|
//-1代表没有条目被选中
|
||||||
|
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
//1.把选中的条目取出来
|
||||||
|
String item = items[which];
|
||||||
|
Toast.makeText(getApplicationContext(),item.toString(),Toast.LENGTH_LONG).show();
|
||||||
|
send_text.setText(item.toString());
|
||||||
|
SharedPreferences.Editor editor = getSharedPreferences("setting",MODE_PRIVATE).edit();
|
||||||
|
editor.putString("send",item.toString());
|
||||||
|
editor.commit();
|
||||||
|
//2.然后把对话框关闭
|
||||||
|
dialog.dismiss();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//一样要show
|
||||||
|
builder.show();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package com.example.myapplication.weather;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
|
||||||
|
public abstract class SingleFragmentActivity extends AppCompatActivity {
|
||||||
|
protected abstract Fragment createFragment();
|
||||||
|
protected abstract int getLayoutId();
|
||||||
|
protected abstract int getFragmentId();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(getLayoutId());
|
||||||
|
|
||||||
|
FragmentManager fm = getSupportFragmentManager();
|
||||||
|
Fragment fragment = fm.findFragmentById(getFragmentId());
|
||||||
|
|
||||||
|
if(fragment == null){
|
||||||
|
fragment = createFragment();
|
||||||
|
fm.beginTransaction().
|
||||||
|
add(getFragmentId(),fragment)
|
||||||
|
.commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package com.example.myapplication.weather;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import com.example.myapplication.R;
|
||||||
|
|
||||||
|
public class WeatherDetailActivity extends SingleFragmentActivity{
|
||||||
|
public static final String EXTRA_WEATHER_ITEM = "com.example.weather.weatherItem";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Fragment createFragment() {
|
||||||
|
WeatherItem weatherItem = (WeatherItem)getIntent().getSerializableExtra(EXTRA_WEATHER_ITEM);
|
||||||
|
return WeatherDetailFragment.newInstance(weatherItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getLayoutId() {
|
||||||
|
return R.layout.activity_detail;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getFragmentId() {
|
||||||
|
return R.id.detail_container;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Intent newIntent(Context packageContext, WeatherItem weatherItem){
|
||||||
|
Intent intent = new Intent(packageContext,WeatherDetailActivity.class);
|
||||||
|
intent.putExtra(EXTRA_WEATHER_ITEM,weatherItem);
|
||||||
|
return intent;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,133 @@
|
|||||||
|
package com.example.myapplication.weather;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import com.example.myapplication.R;
|
||||||
|
|
||||||
|
public class WeatherDetailFragment extends Fragment {
|
||||||
|
private WeatherItem mWeatherItem; //用来设置UI
|
||||||
|
|
||||||
|
private TextView mDeatilDate;
|
||||||
|
private TextView mDetailMaxTemp;
|
||||||
|
private TextView mDetailMinTemp;
|
||||||
|
private ImageView mDetialIcon;
|
||||||
|
private TextView mDetailDesc;
|
||||||
|
private TextView mDetailHumidity;
|
||||||
|
private TextView mDetailPressure;
|
||||||
|
private TextView mDetailWind;
|
||||||
|
|
||||||
|
private static final String TAG = "WeatherDetailFragment";
|
||||||
|
private static final String ARG_ITEM = "args_item";
|
||||||
|
private String unit_text = "°";
|
||||||
|
|
||||||
|
public static WeatherDetailFragment newInstance(WeatherItem weatherItem) {
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putSerializable(ARG_ITEM,weatherItem);
|
||||||
|
WeatherDetailFragment fragment = new WeatherDetailFragment();
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取drawable图标资源的id
|
||||||
|
public int getIconId(Context mContext, String icon){
|
||||||
|
int i= getResources().getIdentifier(icon, "drawable", mContext.getPackageName()) ;
|
||||||
|
if(i>0){
|
||||||
|
Log.i(TAG,"Success to get drawable resoure");
|
||||||
|
}else{
|
||||||
|
Log.i(TAG,"Fail to get drawable resoure");
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setHasOptionsMenu(true);
|
||||||
|
mWeatherItem = (WeatherItem) getArguments().getSerializable(ARG_ITEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
|
View v = inflater.inflate(R.layout.fragment_weather_detail,container,false);
|
||||||
|
if(getActivity().getSharedPreferences("setting",Context.MODE_PRIVATE).getString("unit","摄氏度")=="华氏度"){
|
||||||
|
unit_text = "℉";
|
||||||
|
}
|
||||||
|
|
||||||
|
mDeatilDate = (TextView) v.findViewById(R.id.detail_date);
|
||||||
|
mDetailMaxTemp = (TextView) v.findViewById(R.id.detail_max_temp);
|
||||||
|
mDetailMinTemp = (TextView) v.findViewById(R.id.detail_min_temp);
|
||||||
|
mDetialIcon = (ImageView) v.findViewById(R.id.detail_icon);
|
||||||
|
mDetailHumidity = (TextView) v.findViewById(R.id.detail_humidity);
|
||||||
|
mDetailPressure = (TextView) v.findViewById(R.id.detail_pressure);
|
||||||
|
mDetailWind = (TextView) v.findViewById(R.id.detail_wind);
|
||||||
|
mDetailDesc = (TextView) v.findViewById(R.id.detail_desc);
|
||||||
|
|
||||||
|
mDeatilDate.setText(mWeatherItem.getData());
|
||||||
|
mDetailMaxTemp.setText(mWeatherItem.getMax_temp()+unit_text);
|
||||||
|
mDetailMinTemp.setText(mWeatherItem.getMin_temp()+unit_text);
|
||||||
|
String icon = "a"+mWeatherItem.getIcon();
|
||||||
|
int id = getIconId(getContext(),icon);
|
||||||
|
Drawable drawable = getResources().getDrawable(id);
|
||||||
|
mDetialIcon.setImageDrawable(drawable);
|
||||||
|
mDetailHumidity.setText("Humidity: "+mWeatherItem.getHumidity()+" %");
|
||||||
|
mDetailPressure.setText("Pressure: "+mWeatherItem.getPressure()+" hPa");
|
||||||
|
mDetailWind.setText("Wind: "+mWeatherItem.getWind()+" km/h SE");
|
||||||
|
mDetailDesc.setText(mWeatherItem.getText());
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String createMessage(){
|
||||||
|
String message = "";
|
||||||
|
message += "今天的天气状况为:"+mWeatherItem.getText();
|
||||||
|
message += " 今天的最高温度是: "+mWeatherItem.getMax_temp();
|
||||||
|
message += " 今天的最低温度是: "+mWeatherItem.getMin_temp();
|
||||||
|
message += " 今天的湿度为: "+mWeatherItem.getHumidity();
|
||||||
|
message += " 今天的风速为:"+mWeatherItem.getWind();
|
||||||
|
message += " 今天的气压为:"+mWeatherItem.getPressure();
|
||||||
|
message += " 希望您拥有美好的一天!";
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
|
||||||
|
super.onCreateOptionsMenu(menu, inflater);
|
||||||
|
if(getActivity().findViewById(R.id.fragment_container)==null){ //是手机模式
|
||||||
|
inflater.inflate(R.menu.fragment_detail,menu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||||
|
switch (item.getItemId()){
|
||||||
|
case R.id.menu_setting:
|
||||||
|
Intent intent = new Intent(getActivity(),SettingActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
return true;
|
||||||
|
case R.id.menu_share:
|
||||||
|
Intent i = new Intent(Intent.ACTION_SEND);
|
||||||
|
i.setType("text/plain");
|
||||||
|
i.putExtra(Intent.EXTRA_TEXT,createMessage());
|
||||||
|
startActivity(i);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
package com.example.myapplication.weather;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class WeatherItem implements Serializable {
|
||||||
|
private String data; //天气日期
|
||||||
|
private String max_temp; //最高温度
|
||||||
|
private String min_temp; //最低温度
|
||||||
|
private String text; //天气描述
|
||||||
|
private String humidity; //适度
|
||||||
|
private String pressure; //气压
|
||||||
|
private String wind; //风力
|
||||||
|
private String icon; //图标
|
||||||
|
|
||||||
|
public String getIcon() {
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIcon(String icon) {
|
||||||
|
this.icon = icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setData(String data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMax_temp() {
|
||||||
|
return max_temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMax_temp(String max_temp) {
|
||||||
|
this.max_temp = max_temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMin_temp() {
|
||||||
|
return min_temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMin_temp(String min_temp) {
|
||||||
|
this.min_temp = min_temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getText() {
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setText(String text) {
|
||||||
|
this.text = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHumidity() {
|
||||||
|
return humidity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHumidity(String humidity) {
|
||||||
|
this.humidity = humidity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPressure() {
|
||||||
|
return pressure;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPressure(String pressure) {
|
||||||
|
this.pressure = pressure;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getWind() {
|
||||||
|
return wind;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWind(String wind) {
|
||||||
|
this.wind = wind;
|
||||||
|
}
|
||||||
|
}
|
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 6.0 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 5.8 KiB |
After Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 5.6 KiB |
After Width: | Height: | Size: 7.2 KiB |
After Width: | Height: | Size: 4.8 KiB |
After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 4.8 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 6.0 KiB |
After Width: | Height: | Size: 5.4 KiB |
After Width: | Height: | Size: 4.7 KiB |
After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 5.1 KiB |
After Width: | Height: | Size: 5.1 KiB |
After Width: | Height: | Size: 5.2 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 4.7 KiB |
After Width: | Height: | Size: 6.4 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 5.2 KiB |
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 6.5 KiB |
After Width: | Height: | Size: 6.0 KiB |
After Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 5.8 KiB |
After Width: | Height: | Size: 5.6 KiB |