| @ -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 |