android bundle putExtra RadioGroup

本文详细介绍了在Android环境中,两个Activity之间通过Intent传递数据实现用户注册信息的完整过程,包括定义可序列化的Person类用于记录注册信息,以及在注册界面接收用户输入并将其传递到下一个接受信息窗口进行展示。

在Android中,两个Acitivity之间是靠Intent传递信息的,因为Intent本来就起到信使的作用,所以用它来传递数据也显得顺理成章了.

Intent 提供了多个方法来"携带"额外的数据

putExtras(Bundle data): 向Intent中放入需要"携带"的数据

putXxx(String key,Xxx date):向Bundle放入Int,Long等各种类型的数据(Xxx指代各种数据类型的名称)

putSerializable(String key,Serializable date):向Bundle中放入一个可序列化的对象.

当然Intent也提供了相应的取出"携带"数据的方法

getXxx(String key):从Bundle取出Int,Long 等各种数据类型的数据.

getSerializable(String Key,Serializable data): 从Bundle取出一个可序列化的对象.

下面以使用getSerializable为例,定义一个可序列化的Person类,模拟一个用户注册的过程,通过注册那个窗口(Acitivity)传递注册信息到另一个窗口

下面是定义的一个DTO类Person用来记录注册的信息,注意!要定义成可序列化的类,继承Serializable

[java]  view plain copy print ?
  1. package WangLi.Activity.Bundle;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class Person implements Serializable {  
  6.     private String _Name;  
  7.     private String _Passwd;  
  8.     private String _Gender;  
  9.     public String getName()  
  10.     {  
  11.         return _Name;  
  12.     }  
  13.     public String getPass()  
  14.     {  
  15.         return _Passwd;  
  16.     }  
  17.     public String getGender()  
  18.     {  
  19.         return _Gender;  
  20.     }  
  21.     public Person(String Name,String Passwd,String Gender)  
  22.     {  
  23.         this._Name = Name;  
  24.         this._Passwd = Passwd;  
  25.         this._Gender = Gender;  
  26.     }  
  27. }  

第一个Activity界面如图


填入注册信息后,点"注册"后跳到新窗口,显示刚刚输入的信息

下面是注册窗口,界面xml 和代码

[html]  view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <TableLayout  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content" >  
  10.          
  11.         <TextView   
  12.             android:layout_width="fill_parent"  
  13.             android:layout_height="wrap_content"  
  14.             android:text="请输入您的注册信息"  
  15.             android:textSize="20sp"  
  16.             />  
  17.           
  18.         <TableRow>  
  19.             <TextView  
  20.                 android:layout_width="fill_parent"  
  21.                 android:layout_height="wrap_content"  
  22.                 android:text="用户名:"  
  23.                 android:textSize="16sp"  
  24.             />  
  25.               
  26.             <EditText  
  27.                 android:id="@+id/name"  
  28.                 android:layout_width="fill_parent"  
  29.                 android:layout_height="wrap_content"  
  30.                 android:hint="请填写想注册的账号"  
  31.                 android:selectAllOnFocus="true"  
  32.              />  
  33.         </TableRow>  
  34.   
  35.         <TableRow>  
  36.             <TextView  
  37.                 android:layout_width="fill_parent"  
  38.                 android:layout_height="wrap_content"  
  39.                 android:text="密码:"  
  40.                 android:textSize="16sp"  
  41.             />  
  42.             <EditText  
  43.                 android:id="@+id/passwd"  
  44.                 android:layout_width="fill_parent"  
  45.                 android:layout_height="wrap_content"  
  46.                 android:password = "true"  
  47.                 android:selectAllOnFocus="true"  
  48.              />  
  49.         </TableRow>  
  50.   
  51.         <TableRow>  
  52.             <TextView  
  53.                 android:layout_width="fill_parent"  
  54.                 android:layout_height="wrap_content"  
  55.                 android:text="性别"  
  56.                 android:textSize="16sp"  
  57.             />  
  58.             <RadioGroup  
  59.                 android:layout_width="fill_parent"  
  60.                 android:layout_height="wrap_content"  
  61.                 android:orientation="horizontal"  
  62.             >  
  63.                 <RadioButton   
  64.                     android:id="@+id/male"  
  65.                     android:layout_width="wrap_content"  
  66.                     android:layout_height="wrap_content"  
  67.                     android:text="男"  
  68.                     android:textSize="16sp"  
  69.                     />  
  70.                  <RadioButton   
  71.                     android:id="@+id/female"  
  72.                     android:layout_width="wrap_content"  
  73.                     android:layout_height="wrap_content"  
  74.                     android:text="女"  
  75.                     android:textSize="16sp"  
  76.                     />  
  77.             </RadioGroup>  
  78.         </TableRow>  
  79.   
  80.         <TableRow>  
  81.             <Button  
  82.                 android:id="@+id/bn"  
  83.                 android:layout_width="wrap_content"  
  84.                 android:layout_height="wrap_content"  
  85.                 android:text='注册'  
  86.                 android:textSize="16sp"  
  87.                 />  
  88.         </TableRow>  
  89.     </TableLayout>  
  90.   
  91. </LinearLayout>  
[java]  view plain copy print ?
  1. package WangLi.Activity.Bundle;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.EditText;  
  10. import android.widget.RadioButton;  
  11.   
  12. public class BundleTest extends Activity {  
  13.     /** Called when the activity is first created. */  
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.main);  
  18.         Button bn = (Button)findViewById(R.id.bn);  
  19.         bn.setOnClickListener(new OnClickListener()  
  20.         {  
  21.             public void onClick(View v)  
  22.             {  
  23.                 EditText name = (EditText)findViewById(R.id.name);  
  24.                 EditText passwd = (EditText)findViewById(R.id.passwd);  
  25.                 RadioButton male = (RadioButton)findViewById(R.id.male);  
  26.                 String gender = male.isChecked() ? "男" : "女";  
  27.                 Person p = new Person(name.getText().toString(),passwd.getText().toString(),gender);  
  28.                 //创建Bundle对象  
  29.                 Bundle data = new Bundle();  
  30.                 data.putSerializable("person", p);  
  31.                 //创建一个Intent  
  32.                 Intent intent = new Intent(BundleTest.this,ResultActivity.class);  
  33.                 intent.putExtras(data);  
  34.                 //启动intent对应的Activity  
  35.                 startActivity(intent);  
  36.             }  
  37.         });  
  38.     }  
  39. }  

下面是第接受信息窗口在接受到注册信息以后的样子


第二个接受信息窗口界面xml 及代码

[html]  view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <TableLayout  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content" >  
  10.          
  11.         <TextView   
  12.             android:layout_width="fill_parent"  
  13.             android:layout_height="wrap_content"  
  14.             android:text="请输入您的注册信息"  
  15.             android:textSize="20sp"  
  16.             />  
  17.           
  18.         <TableRow>  
  19.             <TextView  
  20.                 android:layout_width="fill_parent"  
  21.                 android:layout_height="wrap_content"  
  22.                 android:text="用户名:"  
  23.                 android:textSize="16sp"  
  24.             />  
  25.               
  26.             <EditText  
  27.                 android:id="@+id/name"  
  28.                 android:layout_width="fill_parent"  
  29.                 android:layout_height="wrap_content"  
  30.                 android:hint="请填写想注册的账号"  
  31.                 android:selectAllOnFocus="true"  
  32.              />  
  33.         </TableRow>  
  34.   
  35.         <TableRow>  
  36.             <TextView  
  37.                 android:layout_width="fill_parent"  
  38.                 android:layout_height="wrap_content"  
  39.                 android:text="密码:"  
  40.                 android:textSize="16sp"  
  41.             />  
  42.             <EditText  
  43.                 android:id="@+id/passwd"  
  44.                 android:layout_width="fill_parent"  
  45.                 android:layout_height="wrap_content"  
  46.                 android:password = "true"  
  47.                 android:selectAllOnFocus="true"  
  48.              />  
  49.         </TableRow>  
  50.   
  51.         <TableRow>  
  52.             <TextView  
  53.                 android:layout_width="fill_parent"  
  54.                 android:layout_height="wrap_content"  
  55.                 android:text="性别"  
  56.                 android:textSize="16sp"  
  57.             />  
  58.             <RadioGroup  
  59.                 android:layout_width="fill_parent"  
  60.                 android:layout_height="wrap_content"  
  61.                 android:orientation="horizontal"  
  62.             >  
  63.                 <RadioButton   
  64.                     android:id="@+id/male"  
  65.                     android:layout_width="wrap_content"  
  66.                     android:layout_height="wrap_content"  
  67.                     android:text="男"  
  68.                     android:textSize="16sp"  
  69.                     />  
  70.                  <RadioButton   
  71.                     android:id="@+id/female"  
  72.                     android:layout_width="wrap_content"  
  73.                     android:layout_height="wrap_content"  
  74.                     android:text="女"  
  75.                     android:textSize="16sp"  
  76.                     />  
  77.             </RadioGroup>  
  78.         </TableRow>  
  79.   
  80.         <TableRow>  
  81.             <Button  
  82.                 android:id="@+id/bn"  
  83.                 android:layout_width="wrap_content"  
  84.                 android:layout_height="wrap_content"  
  85.                 android:text='注册'  
  86.                 android:textSize="16sp"  
  87.                 />  
  88.         </TableRow>  
  89.     </TableLayout>  
  90.   
  91. </LinearLayout>  

[java]  view plain copy print ?
  1. package WangLi.Activity.Bundle;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.widget.TextView;  
  7.   
  8. public class ResultActivity extends Activity {  
  9.      @Override  
  10.      public void onCreate(Bundle savedInstanceState)  
  11.      {  
  12.          super.onCreate(savedInstanceState);  
  13.          setContentView(R.layout.result);  
  14.          TextView name = (TextView)findViewById(R.id.name);  
  15.          TextView passwd = (TextView)findViewById(R.id.passwd);  
  16.          TextView gender = (TextView)findViewById(R.id.gender);  
  17.          //获取启动该Result的Intent  
  18.          Intent intent = getIntent();  
  19.          //获取该intent所携带的数据  
  20.          Bundle data = intent.getExtras();  
  21.          //从Bundle包中取出数据  
  22.          Person p = (Person)data.getSerializable("person");  
  23.          name.setText("用户名:"+p.getName());  
  24.          passwd.setText("密码:"+p.getPass());  
  25.          gender.setText("性别:"+p.getGender());  
  26.      }  
  27. }  
你更改后他还是不行。其实问题不止这个,还有很多很多,这个问题我想放到最后再去修改,在这之前有个SearchResultActivity,也是你上面提供的,代码如下:package com.example.bus; import android.content.Intent; import android.os.Bundle; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.amap.api.services.core.LatLonPoint; import com.amap.api.services.core.PoiItem; import com.amap.api.services.poisearch.PoiResult; import com.amap.api.services.poisearch.PoiSearch; import java.util.ArrayList; import java.util.List; public class SearchResultActivity extends AppCompatActivity implements PoiSearch.OnPoiSearchListener { private EditText searchInput; private Button searchBtn; private RecyclerView resultListView; private Button goToBtn; private List<PoiItem> poiList = new ArrayList<>(); private ResultAdapter adapter; private PoiSearch poiSearch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search_result); initViews(); setupSearch(); } private void initViews() { searchInput = findViewById(R.id.search_input); searchBtn = findViewById(R.id.search_btn); resultListView = findViewById(R.id.result_list); goToBtn = findViewById(R.id.btn_go_to); } private void setupSearch() { // 接收传入关键词 String keyword = getIntent().getStringExtra("keyword"); if (keyword != null && !keyword.isEmpty()) { searchInput.setText(keyword); performSearch(keyword); } searchBtn.setOnClickListener(v -> { String text = searchInput.getText().toString().trim(); if (!text.isEmpty()) performSearch(text); else Toast.makeText(this, "请输入关键词", Toast.LENGTH_SHORT).show(); }); goToBtn.setEnabled(false); goToBtn.setOnClickListener(v -> { if (!poiList.isEmpty()) { PoiItem target = poiList.get(0); // 默认选第一个 LatLonPoint point = target.getLatLonPoint(); Intent intent = new Intent(this, RoutePlanActivity.class); intent.putExtra("start_mode", "my_location"); // 表示从“我的位置”出发 intent.putExtra("target_lat", point.getLatitude()); intent.putExtra("target_lng", point.getLongitude()); intent.putExtra("target_title", target.getTitle()); startActivity(intent); } }); } private void performSearch(String keyword) { PoiSearch.Query query = new PoiSearch.Query(keyword, "busstation|busline", ""); // 只搜公交相关 query.setPageSize(20); try { poiSearch = new PoiSearch(this, query); poiSearch.setOnPoiSearchListener(this); poiSearch.searchPOIAsyn(); // 异步方法 → 不会抛异常 } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, "搜索初始化失败,请检查地图服务", Toast.LENGTH_SHORT).show(); } } @Override public void onPoiSearched(PoiResult result, int rCode) { if (rCode == 1000 && result != null && result.getPois() != null) { poiList.clear(); poiList.addAll(result.getPois()); if (adapter == null) { adapter = new ResultAdapter(poiList, item -> { // 可扩展:点击某个站点查看详情 }); resultListView.setLayoutManager(new LinearLayoutManager(this)); resultListView.setAdapter(adapter); } else { adapter.notifyDataSetChanged(); } goToBtn.setEnabled(!poiList.isEmpty()); } else { Toast.makeText(this, "搜索失败: 错误码=" + rCode, Toast.LENGTH_SHORT).show(); } } @Override public void onPoiItemSearched(PoiItem item, int rCode) { // 本项目未使用单个 POI 搜索功能 } } activity_search_result.xml代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="8dp" android:fitsSystemWindows="true" android:background="@color/surface_background"> <!-- 搜索栏 --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginBottom="8dp"> <EditText android:id="@+id/search_input" android:layout_width="0dp" android:layout_height="48dp" android:layout_weight="1" android:hint="搜索公交站或线路" android:padding="12dp" android:background="@drawable/rounded_edittext" android:layout_marginEnd="8dp" /> <Button android:id="@+id/search_btn" android:layout_width="wrap_content" android:layout_height="48dp" android:text="搜索" /> </LinearLayout> <!-- 搜索结果列表 --> <androidx.recyclerview.widget.RecyclerView android:id="@+id/result_list" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <!-- “到这去”按钮 --> <Button android:id="@+id/btn_go_to" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="到这去" android:layout_marginTop="8dp" android:backgroundTint="@color/design_default_color_primary" /> </LinearLayout> 首先,我不是很想用LinearLayout布局,我想用ConstraintLayout布局,而且呢这个布局我希望以百分比的形式显示在页面上,因为每个设备的长宽比都不一样,如果是固定了各部分组件的距离的话,他在另一个设备上显示就不美观了。其次,这个界面少了一个返回主界面的功能。这个的话,我之前那个activity_survey.xml就做得很好。activity_survey.xml代码如下:<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" android:fitsSystemWindows="true" android:background="@color/surface_background"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!-- 问题1:评分 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginBottom="32dp" android:text="🚌 用户体验调研" android:textColor="#777777" android:textSize="24sp" android:textStyle="bold" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1. 您对本应用的整体评分是?" android:textStyle="bold" android:textColor="#777777" android:layout_marginBottom="8dp" /> <RadioGroup android:id="@+id/radioGroupRating" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="24dp"> <RadioButton android:text="⭐ 1分 - 非常不满意" android:textColor="@color/black" android:id="@+id/rb1" android:layout_height="match_parent" android:layout_width="match_parent"/> <RadioButton android:text="⭐⭐ 2分 - 不满意" android:textColor="@color/black" android:id="@+id/rb2" android:layout_height="match_parent" android:layout_width="match_parent"/> <RadioButton android:text="⭐⭐⭐ 3分 - 一般" android:textColor="@color/black" android:id="@+id/rb3" android:layout_height="match_parent" android:layout_width="match_parent"/> <RadioButton android:text="⭐⭐⭐⭐ 4分 - 满意" android:textColor="@color/black" android:id="@+id/rb4" android:layout_height="match_parent" android:layout_width="match_parent"/> <RadioButton android:text="⭐⭐⭐⭐⭐ 5分 - 非常满意" android:textColor="@color/black" android:id="@+id/rb5" android:layout_height="match_parent" android:layout_width="match_parent"/> </RadioGroup> <!-- 问题2:满意度 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2. 您对以下哪些方面或功能感到满意?(可多选)" android:textColor="#777777" android:textStyle="bold" android:layout_marginBottom="8dp" /> <CheckBox android:id="@+id/cb_ui" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="界面美观易用" android:textColor="@color/black"/> <CheckBox android:id="@+id/cb_speed" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="加载速度快" android:textColor="@color/black"/> <CheckBox android:id="@+id/cb_information" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询信息准确" android:textColor="@color/black"/> <CheckBox android:id="@+id/cb_other" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="其他" android:textColor="@color/black"/> <!-- 问题3:建议 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="3. 您有什么改进建议?" android:textColor="#777777" android:textStyle="bold" android:layout_marginTop="24dp" android:layout_marginBottom="8dp" /> <EditText android:id="@+id/et_suggestion" android:layout_width="match_parent" android:layout_height="120dp" android:gravity="top" android:hint="请输入您的建议..." android:textColorHint="#777777" android:textColor="@color/black" android:inputType="textMultiLine" android:minLines="3" /> <!-- 提交按钮 --> <Button android:id="@+id/btn_submit" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="提交反馈" android:textSize="18sp" android:layout_marginTop="32dp" style="?android:attr/buttonStyle" /> </LinearLayout> </ScrollView> SurveyActivity代码如下:package com.example.bus; import android.os.Bundle; import android.widget.*; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.app.AlertDialog; public class SurveyActivity extends AppCompatActivity { private static final String FEEDBACK_EMAIL = "your_email@example.com"; // 修改为你自己的邮箱地址 private static final String EMAIL_SUBJECT = "用户调研反馈"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_survey); // 显示 ActionBar 上的返回箭头 if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setTitle("用户调研"); } // 绑定控件 RadioGroup radioGroupRating = findViewById(R.id.radioGroupRating); CheckBox cbUi = findViewById(R.id.cb_ui); CheckBox cbSpeed = findViewById(R.id.cb_speed); CheckBox cbInformation = findViewById(R.id.cb_information); CheckBox cbOther = findViewById(R.id.cb_other); EditText etSuggestion = findViewById(R.id.et_suggestion); Button btnSubmit = findViewById(R.id.btn_submit); // 提交按钮点击事件 btnSubmit.setOnClickListener(v -> { // 获取评分 int selectedId = radioGroupRating.getCheckedRadioButtonId(); String rating = "未评分"; if (selectedId == R.id.rb1) rating = "1分"; else if (selectedId == R.id.rb2) rating = "2分"; else if (selectedId == R.id.rb3) rating = "3分"; else if (selectedId == R.id.rb4) rating = "4分"; else if (selectedId == R.id.rb5) rating = "5分"; // 获取满意度选项 StringBuilder satisfaction = new StringBuilder(); if (cbUi.isChecked()) satisfaction.append("界面美观易用, "); if (cbSpeed.isChecked()) satisfaction.append("加载速度快, "); if (cbInformation.isChecked()) satisfaction.append("功能丰富实用, "); if (cbOther.isChecked()) satisfaction.append("其他, "); String satisfactionStr = satisfaction.length() > 0 ? satisfaction.substring(0, satisfaction.length() - 2) : "无"; // 获取建议 String suggestion = etSuggestion.getText().toString().trim(); if (suggestion.isEmpty()) suggestion = "无"; // 拼接邮件正文 String body = String.format( "用户调研反馈\n\n" + "【整体评分】\n%s\n\n" + "【满意项】\n%s\n\n" + "【改进建议】\n%s\n\n" + "---\n来自 Android 客户端自动提交", rating, satisfactionStr, suggestion ); // 发送邮件 sendEmail(body); }); } /** * 发送邮件核心方法 */ private void sendEmail(String body) { try { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); // 纯文本 // 设置收件人邮箱(必须为字符串数组) intent.putExtra(Intent.EXTRA_EMAIL, new String[]{FEEDBACK_EMAIL}); // 设置主题和正文 intent.putExtra(Intent.EXTRA_SUBJECT, EMAIL_SUBJECT); intent.putExtra(Intent.EXTRA_TEXT, body); // 启动系统选择器 startActivity(Intent.createChooser(intent, "选择邮件客户端")); } catch (Exception e) { Toast.makeText(this, "无法启动邮件应用,请安装Gmail、QQ邮箱等程序", Toast.LENGTH_LONG).show(); } } @Override public boolean onSupportNavigateUp() { onBackPressed(); // 执行返回操作 return true; // 表示已处理该事件 } } 我希望像这种在顶部的框加个能够返回主界面的东西。还有就是第三个,activity_search_result.xml上面不是也有个搜索框嘛,我希望在home界面搜索的内容也显示在这里,如果在搜索框重新点击搜索按钮后,底下会更新搜索数据,最好在这个界面也加一个地图,可以为用户提供地图选点功能,跟我map界面一样的加载地图流程。MapFragment代码如下:package com.example.bus.ui.map; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import com.amap.api.maps.MapView; import com.amap.api.maps.AMap; import com.amap.api.maps.model.LatLng; //import com.example.bus.R; //import com.example.bus.databinding.FragmentMapBinding; import com.amap.api.maps.CameraUpdateFactory; import com.amap.api.maps.UiSettings; import com.example.bus.R; import com.example.bus.RoutePlanActivity; import com.example.bus.databinding.FragmentMapBinding; // MapView 已在 XML 中声明,无需额外 import(会自动识别) public class MapFragment extends Fragment { private FragmentMapBinding binding; private MapView mapView; // 高德地图视图 private AMap aMap; // 地图控制器 private boolean isFirstLocationSet = false; // 防止反复跳转 @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 初始化 ViewModel 和 ViewBinding binding = FragmentMapBinding.inflate(inflater, container, false); View root = binding.getRoot(); //绑定 MapView mapView = root.findViewById(R.id.map_view); mapView.onCreate(savedInstanceState); // 必须调用生命周期方法 // 初始化地图 initMap(); if (binding.mapSearch != null) { binding.mapSearch.setOnClickListener(v -> { String keyword = binding.mapInput2.getText().toString().trim(); if (keyword.isEmpty()) { Toast.makeText(requireContext(), "请输入终点", Toast.LENGTH_SHORT).show(); return; } // ✅ 直接跳转路线页(不需要权限检查,因为能进此 Fragment 说明已有权限) Intent intent = new Intent(requireContext(), RoutePlanActivity.class); intent.putExtra("start_mode", "input"); // 表示从输入框获取起点 // TODO: 可提取 map_input1.getText() 作为起点坐标(需先搜索) intent.putExtra("target_lat", 0); // 暂空,实际应在搜索后填充 intent.putExtra("target_lng", 0); intent.putExtra("target_title", keyword); startActivity(intent); }); } return root; } /** * 初始化地图 */ private void initMap() { if (aMap == null) { aMap = mapView.getMap(); UiSettings uiSettings = aMap.getUiSettings(); uiSettings.setZoomControlsEnabled(true); // 显示缩放按钮 uiSettings.setCompassEnabled(true); // 显示指南针 uiSettings.setMyLocationButtonEnabled(false); // 我们自己控制定位行为 } } @Override public void onResume() { super.onResume(); //每次恢复可见时都检查权限状态 mapView.onResume(); // ✅ 直接开启定位图层(信任 MainActivity 的判断) if (aMap != null) { aMap.setMyLocationEnabled(true); // 只第一次进入时移动相机 if (!isFirstLocationSet) { LatLng defaultLoc = new LatLng(39.909186, 116.397411); aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(defaultLoc, 12f)); isFirstLocationSet = true; } } } @Override public void onPause() { super.onPause(); mapView.onPause(); } @Override public void onDestroyView() { super.onDestroyView(); if (mapView != null) { mapView.onDestroy(); } binding = null; } @Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } } fragment_map.xml代码如下:<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.map.MapFragment" android:fitsSystemWindows="true" android:background="@color/surface_background"> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_top_offset" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.015" /> <!-- 🔹 起点输入框 --> <EditText android:id="@+id/map_input1" android:layout_width="0dp" android:layout_height="48dp" android:hint="请输入起点" android:textColorHint="#777777" android:textColor="@color/black" android:background="@drawable/rounded_edittext" android:padding="12dp" android:layout_marginStart="16dp" android:layout_marginEnd="8dp" android:layout_marginTop="32dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/guideline_search" app:layout_constraintTop_toTopOf="@id/guideline_top_offset" /> <!-- 🔹 终点输入框 --> <EditText android:id="@+id/map_input2" android:layout_width="0dp" android:layout_height="48dp" android:hint="请输入终点" android:textColorHint="#777777" android:textColor="@color/black" android:background="@drawable/rounded_edittext" android:padding="12dp" android:layout_marginStart="16dp" android:layout_marginEnd="8dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/guideline_search" app:layout_constraintTop_toBottomOf="@id/map_input1" /> <!-- ✅ 分割线:75% 处(原样保留) --> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.75" /> <!-- 🔍 搜索按钮:纵向拉高,覆盖两个输入框 --> <Button android:id="@+id/map_search" android:layout_width="0dp" android:layout_height="0dp" android:text="搜索" android:textSize="16sp" android:gravity="center" app:layout_constraintStart_toStartOf="@id/guideline_search" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/map_input1" app:layout_constraintBottom_toBottomOf="@id/map_input2" android:layout_marginEnd="16dp" /> <!-- 🗺️ 地图视图:从终点输入框下方开始,延伸到底部 --> <com.amap.api.maps.MapView android:id="@+id/map_view" android:text="Bus-1.0" android:textColor="#777777" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/map_input2" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginTop="4dp" android:layout_marginBottom="0dp"/> </androidx.constraintlayout.widget.ConstraintLayout> 第四个,我在fragment_home中搜索的内容无论搜索什么他都还没有数据,这个搜索之后进入SearchResultActivity真的能搜得到高德数据吗?以上提到了home界面,在这里我顺便也把相关代码提供给你。fragment_home.xml代码如下:<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.home.HomeFragment" android:fitsSystemWindows="true" android:background="@color/surface_background"> <!-- 🔍 输入框 --> <EditText android:id="@+id/home_input" android:layout_width="0dp" android:layout_height="wrap_content" android:hint="请输入需要查询的公交线路或站点" android:textColorHint="#777777" android:textColor="@color/black" android:background="@drawable/rounded_edittext" android:minHeight="48dp" android:textSize="16sp" android:padding="12dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/home_search" app:layout_constraintHorizontal_chainStyle="packed" android:layout_marginStart="16dp" android:layout_marginEnd="8dp" android:layout_marginTop="88dp" /> <!-- 🔎 搜索按钮 --> <Button android:id="@+id/home_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="搜索" app:layout_constraintTop_toTopOf="@id/home_input" app:layout_constraintBottom_toBottomOf="@id/home_input" app:layout_constraintStart_toEndOf="@id/home_input" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="16dp" /> <!-- 🚌 图片:居中偏上 --> <ImageView android:id="@+id/image_bus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitCenter" android:src="@drawable/bus" app:layout_constraintTop_toBottomOf="@id/home_input" app:layout_constraintBottom_toTopOf="@+id/text_home" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="144dp" android:layout_marginBottom="144dp"/> <!-- ℹ️ 底部说明文字 --> <TextView android:id="@+id/text_home" android:textColor="#777777" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:textAlignment="center" android:textSize="11sp" app:layout_constraintTop_toBottomOf="@id/image_bus" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> HomeFragment代码如下:package com.example.bus.ui.home; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import com.example.bus.MainActivity; import com.example.bus.SearchResultActivity; import com.example.bus.databinding.FragmentHomeBinding; public class HomeFragment extends Fragment { private FragmentHomeBinding binding; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { com.example.bus.ui.home.HomeViewModel homeViewModel = new ViewModelProvider(this).get(com.example.bus.ui.home.HomeViewModel.class); binding = FragmentHomeBinding.inflate(inflater, container, false); View root = binding.getRoot(); final TextView textView = binding.textHome; homeViewModel.getText().observe(getViewLifecycleOwner(), textView::setText); binding.homeSearch.setOnClickListener(v -> { String keyword = binding.homeInput.getText().toString().trim(); if (keyword.isEmpty()) { Toast.makeText(requireContext(), "请输入关键词", Toast.LENGTH_SHORT).show(); return; } // ✅ 使用 MainActivity 的统一权限流程 MainActivity activity = (MainActivity) requireActivity(); activity.ensureFineLocationPermission(() -> { // ✅ 权限通过后再跳转 Intent intent = new Intent(requireContext(), SearchResultActivity.class); intent.putExtra("keyword", keyword); startActivity(intent); }); }); return root; } @Override public void onDestroyView() { super.onDestroyView(); binding = null; } }
11-07
等一下,这部分代码我觉得应该结合一下他的java文件,java文件不改,只是说布局文件修改后id那些别乱套。还是一样,仅修改布局成constraintlayout,使用guideline和space来决定组件跟组件之间的距离。但是组件内容我不想改变。首先activity_survey.xml代码如下:<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" android:fitsSystemWindows="true" android:background="@color/surface_background"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!-- 问题1:评分 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginBottom="32dp" android:text="🚌 用户体验调研" android:textColor="#777777" android:textSize="24sp" android:textStyle="bold" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1. 您对本应用的整体评分是?" android:textStyle="bold" android:textColor="#777777" android:layout_marginBottom="8dp" /> <RadioGroup android:id="@+id/radioGroupRating" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="24dp"> <RadioButton android:text="⭐ 1分 - 非常不满意" android:textColor="@color/black" android:id="@+id/rb1" android:layout_height="match_parent" android:layout_width="match_parent"/> <RadioButton android:text="⭐⭐ 2分 - 不满意" android:textColor="@color/black" android:id="@+id/rb2" android:layout_height="match_parent" android:layout_width="match_parent"/> <RadioButton android:text="⭐⭐⭐ 3分 - 一般" android:textColor="@color/black" android:id="@+id/rb3" android:layout_height="match_parent" android:layout_width="match_parent"/> <RadioButton android:text="⭐⭐⭐⭐ 4分 - 满意" android:textColor="@color/black" android:id="@+id/rb4" android:layout_height="match_parent" android:layout_width="match_parent"/> <RadioButton android:text="⭐⭐⭐⭐⭐ 5分 - 非常满意" android:textColor="@color/black" android:id="@+id/rb5" android:layout_height="match_parent" android:layout_width="match_parent"/> </RadioGroup> <!-- 问题2:满意度 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2. 您对以下哪些方面或功能感到满意?(可多选)" android:textColor="#777777" android:textStyle="bold" android:layout_marginBottom="8dp" /> <CheckBox android:id="@+id/cb_ui" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="界面美观易用" android:textColor="@color/black"/> <CheckBox android:id="@+id/cb_speed" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="加载速度快" android:textColor="@color/black"/> <CheckBox android:id="@+id/cb_information" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询信息准确" android:textColor="@color/black"/> <CheckBox android:id="@+id/cb_other" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="其他" android:textColor="@color/black"/> <!-- 问题3:建议 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="3. 您有什么改进建议?" android:textColor="#777777" android:textStyle="bold" android:layout_marginTop="24dp" android:layout_marginBottom="8dp" /> <EditText android:id="@+id/et_suggestion" android:layout_width="match_parent" android:layout_height="120dp" android:gravity="top" android:hint="请输入您的建议..." android:textColorHint="#777777" android:textColor="@color/black" android:inputType="textMultiLine" android:minLines="3" /> <!-- 提交按钮 --> <Button android:id="@+id/btn_submit" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="提交反馈" android:textSize="18sp" android:layout_marginTop="32dp" style="?android:attr/buttonStyle" /> </LinearLayout> </ScrollView> SurveyActivity代码如下:package com.example.bus; import android.os.Bundle; import android.widget.*; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.app.AlertDialog; public class SurveyActivity extends AppCompatActivity { private static final String FEEDBACK_EMAIL = "your_email@example.com"; // 修改为你自己的邮箱地址 private static final String EMAIL_SUBJECT = "用户调研反馈"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_survey); // 显示 ActionBar 上的返回箭头 if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setTitle("用户调研"); } // 绑定控件 RadioGroup radioGroupRating = findViewById(R.id.radioGroupRating); CheckBox cbUi = findViewById(R.id.cb_ui); CheckBox cbSpeed = findViewById(R.id.cb_speed); CheckBox cbInformation = findViewById(R.id.cb_information); CheckBox cbOther = findViewById(R.id.cb_other); EditText etSuggestion = findViewById(R.id.et_suggestion); Button btnSubmit = findViewById(R.id.btn_submit); // 提交按钮点击事件 btnSubmit.setOnClickListener(v -> { // 获取评分 int selectedId = radioGroupRating.getCheckedRadioButtonId(); String rating = "未评分"; if (selectedId == R.id.rb1) rating = "1分"; else if (selectedId == R.id.rb2) rating = "2分"; else if (selectedId == R.id.rb3) rating = "3分"; else if (selectedId == R.id.rb4) rating = "4分"; else if (selectedId == R.id.rb5) rating = "5分"; // 获取满意度选项 StringBuilder satisfaction = new StringBuilder(); if (cbUi.isChecked()) satisfaction.append("界面美观易用, "); if (cbSpeed.isChecked()) satisfaction.append("加载速度快, "); if (cbInformation.isChecked()) satisfaction.append("功能丰富实用, "); if (cbOther.isChecked()) satisfaction.append("其他, "); String satisfactionStr = satisfaction.length() > 0 ? satisfaction.substring(0, satisfaction.length() - 2) : "无"; // 获取建议 String suggestion = etSuggestion.getText().toString().trim(); if (suggestion.isEmpty()) suggestion = "无"; // 拼接邮件正文 String body = String.format( "用户调研反馈\n\n" + "【整体评分】\n%s\n\n" + "【满意项】\n%s\n\n" + "【改进建议】\n%s\n\n" + "---\n来自 Android 客户端自动提交", rating, satisfactionStr, suggestion ); // 发送邮件 sendEmail(body); }); } /** * 发送邮件核心方法 */ private void sendEmail(String body) { try { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); // 纯文本 // 设置收件人邮箱(必须为字符串数组) intent.putExtra(Intent.EXTRA_EMAIL, new String[]{FEEDBACK_EMAIL}); // 设置主题和正文 intent.putExtra(Intent.EXTRA_SUBJECT, EMAIL_SUBJECT); intent.putExtra(Intent.EXTRA_TEXT, body); // 启动系统选择器 startActivity(Intent.createChooser(intent, "选择邮件客户端")); } catch (Exception e) { Toast.makeText(this, "无法启动邮件应用,请安装Gmail、QQ邮箱等程序", Toast.LENGTH_LONG).show(); } } @Override public boolean onSupportNavigateUp() { onBackPressed(); // 执行返回操作 return true; // 表示已处理该事件 } }
11-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值