weigth ^ putExtra

参数管理技巧
本文介绍了一种在Android应用中管理活动间传递参数的方法。通过定义一个参数常量类,可以统一管理参数并方便地查看和修改默认值。示例展示了如何在ActivityB中接收一个艺术家ID参数,并在ActivityA中进行跳转时设置该参数。
建议:在Activity中定义一个PARAM常量类,统一定义所有参数,这样通过查看参数常量类,就知道该Activity能支持哪些参数,并很容易修改默认值
如,Activity B能接收一个艺术家ID的参数
public class B extends CompositeActivity {
//参数常量类
public static class INTENT_PARAM{
public static class ARTIST_ID {
public static String NAME = "artist_id";
private static int DEFAULT_VALUE = 0;
}
}

public void onCreate(Bundle savedInstanceState) {
int artistId=getIntent().getIntExtra(INTENT_PARAM.ARTIST_ID.NAME, PARAM.ARTIST_ID.DEFAULT_VALUE);
}
}


Activity A需要跳转到Activity B
public class A extends CompositeActivity {

public void onCreate(Bundle savedInstanceState) {
//参数名使用B中定义的常量
this.getIntent().putExtra(B.INTENT_PARAM.ARTIST_ID.NAME, 1);
}


实现方式:在菜单之间,添加一个View,其比重为1,这样就会撑开两边的菜单按钮

TextView blankText = new TextView(this);
blankText.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT, 1));
menuBar.addView(blankText);
package com.weishitech.qichechangtingyinyue.fragment.home; import android.content.Intent; import android.os.Bundle; import android.widget.EditText; import android.widget.Toast; import androidx.viewpager2.widget.ViewPager2; import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayoutMediator; import com.hfd.common.base.BaseActivity; import com.weishitech.qichechangtingyinyue.R; import com.weishitech.qichechangtingyinyue.bean.MusicBean; import com.weishitech.qichechangtingyinyue.fragment.Adapter.SectionsPagerAdapter; import java.io.Serializable; import java.util.ArrayList; import java.util.List; public class SearchActivity extends BaseActivity { private ViewPager2 viewPager; private TabLayout tabLayout; EditText et_search; // 存储接收到的数据 private List<MusicBean.DataBean> privateSongList; private List<MusicBean.DataBean> qingyinSongList; @Override protected int setLayout() { return R.layout.activity_search; } @Override protected void setView() { tabLayout = fvbi(R.id.tab_layout); viewPager = fvbi(R.id.view_pager); et_search = fvbi(R.id.et_search); } @Override protected void setData() { // 接收传过来的数据 Bundle bundle = getIntent().getExtras(); if (bundle != null) { privateSongList = (List<MusicBean.DataBean>) bundle.getSerializable("private_song_list"); qingyinSongList = (List<MusicBean.DataBean>) bundle.getSerializable("qingyin_song_list"); } // 安全兜底 if (privateSongList == null) privateSongList = new ArrayList<>(); if (qingyinSongList == null) qingyinSongList = new ArrayList<>(); // 创建适配器并传入两组数据 SectionsPagerAdapter adapter = new SectionsPagerAdapter(this, privateSongList, qingyinSongList); viewPager.setAdapter(adapter); viewPager.setOffscreenPageLimit(1); // “露出三分之一” 效果 viewPager.setPageTransformer((page, position) -> { float width = page.getWidth(); float offset = position * (width * 0.1f); page.setTranslationX(-offset); }); // 绑定 TabLayout new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> { tab.setText(adapter.getTitle(position)); }).attach(); } @Override protected void setClick() { } private void performSearch() { String query = et_search.getText().toString().trim(); if (query.isEmpty()) { Toast.makeText(this, "请输入关键词", Toast.LENGTH_SHORT).show(); return; } // 过滤 privateSongList List<MusicBean.DataBean> resultList = new ArrayList<>(); for (MusicBean.DataBean bean : privateSongList) { if ((bean.getTitle() != null && bean.getTitle().contains(query)) || (bean.getSinger() != null && bean.getSinger().contains(query))) { resultList.add(bean); } } if (resultList.isEmpty()) { Toast.makeText(this, "未找到相关歌曲", Toast.LENGTH_SHORT).show(); return; } // 跳转到 LyricsActivity,并传入整个结果列表 + 指定播放第0首 Intent intent = new Intent(this, LyricsActivity.class); // 必要字段:第一首歌的信息 MusicBean.DataBean firstSong = resultList.get(0); intent.putExtra("title", firstSong.getTitle()); intent.putExtra("singer", firstSong.getSinger()); intent.putExtra("cover_url", firstSong.getCover()); intent.putExtra("music_url", firstSong.getMusic()); // 关键:传入整个搜索结果作为 source_list intent.putExtra("source_list", (Serializable) resultList); intent.putExtra("position", 0); // 当前播放的是第0首 intent.putExtra("total_count", resultList.size()); startActivity(intent); } }这个只能根据输入的文字自动查询,没有点击时间
最新发布
12-05
项目要求:1.三类角色,分别为提问者(学生)、回答者(教师)、潜水者(游客),子类(学生Student、教师Teacher)、父类(Person); 2.根据不同角色增加接口,每个角色一个(教师:回答接口Answerer, 学生:提问接口Questioner, 游客:公共接口Common); 3.任何人可以点“赞”,可以评论(公共接口Common); 4.教师类可以为回答打分(接口Answerer)、提问者可以为回答打分(接口Questioner); 5.必须用数据库(如SQLite)存储信息;//目前用户信息表已完成,问题及其相关信息(包括问题内容,提问者;该问题对应的回答(最多3个)及其回答者、点赞数等)待完善 6.重点代码注释; 请你帮我完善代码,在main页面显示问题列表(ListView形式,包括问题和回答数) package com.example.iask0; import android.content.Intent; import android.view.View; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import com.example.iask0.databinding.ActivityMainBinding; import com.google.android.material.snackbar.Snackbar; import android.view.Menu; import android.view.MenuItem; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.ListView; import android.widget.Toast; import java.util.List; import db.DatabaseManager; public class MainActivity extends AppCompatActivity { public TextView identityTextView; public EditText searchEditText; public Button searchButton; private Button askButton; private Button mineButton; private DatabaseManager dbManager; public ListView questionListView; // 问题列表视图 public List<Question> questionList; // 问题数据列表 private QuestionAdapter adapter; // 问题列表适配器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); identityTextView = findViewById(R.id.identityTextView); searchEditText = findViewById(R.id.searchEditText); searchButton = findViewById(R.id.searchButton); askButton = findViewById(R.id.askButton); mineButton=findViewById(R.id.mineButton); dbManager = new DatabaseManager(this); //获取传递的信息 Intent intent = getIntent(); String username = intent.getStringExtra("username"); String identity= getCurrentIdentity(); identityTextView.setText("身份:" + identity);// 设置用户身份 // 搜索按钮点击事件 searchButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String query = searchEditText.getText().toString(); if (!query.isEmpty()) { // 执行搜索操作 Toast.makeText(MainActivity.this, "搜索: " + query, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "请输入搜索内容", Toast.LENGTH_SHORT).show(); } } }); // 提问按钮点击事件(仅学生可按) askButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 执行提问操作 String question = searchEditText.getText().toString(); dbManager.insertQuestion(question, username); Intent intent = new Intent(MainActivity.this, QuestionDetailActivity.class); intent.putExtra("username_asker", username); intent.putExtra("username", username); intent.putExtra("identity", getCurrentIdentity()); intent.putExtra("question_content",question); startActivity(intent); finish(); Toast.makeText(MainActivity.this, "提问", Toast.LENGTH_SHORT).show(); } }); //“我的”按钮 mineButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MyActivity.class); intent.putExtra("username", username); intent.putExtra("identity", getCurrentIdentity()); startActivity(intent); } }); // 根据当前用户身份显示或隐藏提问按钮 toggleAskButtonVisibility(); } private String getCurrentIdentity() { // 从Intent获取登录信息 Intent intent = getIntent(); String username = intent.getStringExtra("username"); String identity = intent.getStringExtra("identity"); // 设置身份和用户名 if (identity == null) { identity = "游客"; } return identity; } private void toggleAskButtonVisibility() { String identity = getCurrentIdentity(); if ("学生".equals(identity)) { askButton.setVisibility(View.VISIBLE); } else { askButton.setVisibility(View.GONE); } } private void loadQuestionsList() { questionList = dbManager.getAllQuestions();// 从数据库获取所有问题 // 创建并设置适配器 adapter = new QuestionAdapter(this, questionList); questionListView.setAdapter(adapter); } } <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 顶部区域 --> <LinearLayout android:id="@+id/topBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="#5F8772" android:padding="16dp"> <!-- 标题 --> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginLeft="64dp" android:gravity="center" android:text="iask 主页" android:textColor="#FFFFFF" android:textSize="25sp"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:gravity="center"> <!-- 用户身份 --> <TextView android:id="@+id/identityTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="身份:游客" android:textColor="#FFFFFF"/> <!--个人界面跳转按钮--> <Button android:id="@+id/mineButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我的" android:background="#303030"/> </LinearLayout> </LinearLayout> <!-- 搜索区域 --> <LinearLayout android:id="@+id/searchBar" android:layout_below="@id/topBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="8dp"> <!-- 输入框 --> <EditText android:id="@+id/searchEditText" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:hint="输入搜索内容" android:padding="28dp" android:background="#FFFFFF"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <!-- 搜索按钮 --> <Button android:id="@+id/searchButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="搜索" android:background="#303030"/> <!-- 提问按钮(仅学生可按) --> <Button android:id="@+id/askButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="提问" android:background="#000000" android:visibility="gone"/> <!-- 默认不显示 --> </LinearLayout> </LinearLayout> <!-- 问题区域 --> <LinearLayout android:id="@+id/questionBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/searchBar" android:orientation="vertical"> <!-- 选项卡 --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:id="@+id/questionsListHeading"> <TextView android:id="@+id/tabQuestions" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="问题(时间倒序)" android:gravity="center" android:padding="8dp" android:background="#FAFAFA"/> <TextView android:id="@+id/tabAnswers" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0" android:text="回答数" android:gravity="center" android:padding="8dp" android:background="#FAFAFA"/> </LinearLayout> <!-- 问题列表项 --> <ListView android:id="@+id/questionListView" android:layout_below="@+id/questionsListHeading" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> <!-- <LinearLayout android:id="@+id/bottomBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/questionBar"> <Button android:id="@+id/homeButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我的" android:background="#303030"/> </LinearLayout>--> </RelativeLayout> package com.example.iask0; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import db.DatabaseManager; public class QuestionDetailActivity extends AppCompatActivity { private TextView identityTextView; public TextView questionTextView; public TextView askerView; private EditText answerEditText; private Button submitAnswerButton; private ListView answerListView; private DatabaseManager dbManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_question_detail); identityTextView = findViewById(R.id.identityTextView); questionTextView =findViewById(R.id.questionText); askerView = findViewById(R.id.asker); answerEditText = findViewById(R.id.answerEditText); submitAnswerButton = findViewById(R.id.submitAnswerButton); answerListView = findViewById(R.id.answerListView); Button backButton = findViewById(R.id.backButton); Intent intent = getIntent(); String username = intent.getStringExtra("username"); String askername = intent.getStringExtra("username_asker"); String identity = intent.getStringExtra("identity"); String question = intent.getStringExtra("question_content"); // 设置身份和用户名 if (username != null && identity != null) { setIdentity(identity); } else { setIdentity("游客"); } questionTextView.setText("问题内容\n" + question); askerView.setText("提问者:"+ askername); backButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(QuestionDetailActivity.this, MainActivity.class); intent.putExtra("username", username); intent.putExtra("identity", identity); startActivity(intent); finish(); } }); submitAnswerButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String answer = answerEditText.getText().toString(); // 提交回答逻辑 EditText answerContentEditText = findViewById(R.id.answerEditText); String answerContent = answerContentEditText.getText().toString(); String responder = username; long questionId = 1; // 示例问题ID,实际应用中应动态获取 long answerId = dbManager.insertAnswer(answerContent, responder, questionId); if (answerId != -1) { Toast.makeText(QuestionDetailActivity.this, "回答提交成功", Toast.LENGTH_SHORT).show(); } } }); } //界面显示 根据身份 private void setIdentity(String identity) { identityTextView.setText("身份:" + identity); identityTextView.setVisibility(View.VISIBLE); if ("教师".equals(identity)) { answerEditText.setVisibility(View.VISIBLE); submitAnswerButton.setVisibility(View.VISIBLE); } else { answerEditText.setVisibility(View.GONE); submitAnswerButton.setVisibility(View.GONE); } } } --- package db; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import java.util.ArrayList; import java.util.List; public class DatabaseManager extends SQLiteOpenHelper{ private SQLiteDatabase database; private static final String DATABASE_NAME = "iAsk.db"; private static final int DATABASE_VERSION = 1; // 数据库版本 //user表 public static final String TABLE_NAME = "userss";// 表名 // 列名 public static final String COLUMN_ID = "id"; public static final String COLUMN_NAME = "username"; public static final String COLUMN_PASSWORD = "password"; public static final String COLUMN_IDENTIFY = "identity"; //问题和回答表 public static final String QUESTIONS_TABLE_NAME = "questions"; public static final String ANSWERS_TABLE_NAME = "answers"; public static final String QUESTION_ID = "question_id"; public static final String QUESTION_CONTENT = "question_content"; public static final String QUESTION_ASKER = "question_asker"; public static final String QUESTION_TIMESTAMP = "question_timestamp"; public static final String ANSWER_ID = "answer_id"; public static final String ANSWER_CONTENT = "answer_content"; public static final String ANSWER_RESPONDER = "answer_responder"; public static final String ANSWER_TIMESTAMP = "answer_timestamp"; public static final String ANSWER_LIKES = "answer_likes"; public static final String ANSWER_QUESTION_ID = "answer_question_id"; public DatabaseManager(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); Log.d("DB_DEBUG", "===== 进入 DB ====="); this.getWritableDatabase(); } // 创建表的SQL语句 private static final String TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_NAME + " TEXT NOT NULL, " + COLUMN_PASSWORD + " TEXT NOT NULL, "+ COLUMN_IDENTIFY + " TEXT NOT NULL);";//用户表 private static final String CREATE_QUESTIONS_TABLE = "CREATE TABLE IF NOT EXISTS " + QUESTIONS_TABLE_NAME + " (" + QUESTION_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + QUESTION_CONTENT + " TEXT NOT NULL, " + QUESTION_ASKER + " TEXT NOT NULL, " + QUESTION_TIMESTAMP + " TIMESTAMP DEFAULT CURRENT_TIMESTAMP" + ");";//问题表 private static final String CREATE_ANSWERS_TABLE = "CREATE TABLE IF NOT EXISTS " + ANSWERS_TABLE_NAME + " (" + ANSWER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + ANSWER_CONTENT + " TEXT NOT NULL, " + ANSWER_RESPONDER + " TEXT NOT NULL, " + ANSWER_TIMESTAMP + " TIMESTAMP DEFAULT CURRENT_TIMESTAMP, " + ANSWER_LIKES + " INTEGER DEFAULT 0, " + ANSWER_QUESTION_ID + " INTEGER, " + "FOREIGN KEY (" + ANSWER_QUESTION_ID + ") REFERENCES " + QUESTIONS_TABLE_NAME + "(" + QUESTION_ID + ")" + ");";//回答表 @Override public void onCreate(SQLiteDatabase db) { Log.d("DB_DEBUG", " ====== 创 建 表 ====== "); // 创建表 db.execSQL(TABLE_CREATE); db.execSQL(CREATE_QUESTIONS_TABLE); db.execSQL(CREATE_ANSWERS_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//数据库版本更新 // 删除旧表,创建新表(但会丢失数据) db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); db.execSQL("DROP TABLE IF EXISTS " + QUESTIONS_TABLE_NAME); db.execSQL("DROP TABLE IF EXISTS " + ANSWERS_TABLE_NAME); onCreate(db); } // 打开数据库 public void open() { database=this.getWritableDatabase(); } // 检查用户名是否存在(查找数据-user) public boolean checkUsernameExists(String username) { SQLiteDatabase database = this.getReadableDatabase(); Cursor cursor = database.query(TABLE_NAME, new String[]{COLUMN_NAME}, COLUMN_NAME + "=?", new String[]{username}, null, null, null); boolean exists = cursor.getCount() > 0; cursor.close(); return exists; } // 注册(插入数据-user) public boolean insertUser(String username, String password, String identity) { SQLiteDatabase database = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(COLUMN_NAME, username); values.put(COLUMN_PASSWORD, password); values.put(COLUMN_IDENTIFY, identity); long result = database.insert(TABLE_NAME, null, values); return result != -1; } //登录(查找数据-user) public boolean checkPassword(String username, String password) { SQLiteDatabase readableDatabase = this.getReadableDatabase(); Cursor cursor = readableDatabase.query(//在TABLE_NAME表查询 用户名为 username 的密码 TABLE_NAME, new String[]{COLUMN_PASSWORD}, COLUMN_NAME + " = ?", new String[]{username}, null, null, null ); boolean isPasswordCorrect = false; if (cursor.moveToFirst()) { int columnIndex = cursor.getColumnIndex(COLUMN_PASSWORD); // 获取密码列的索引 if (columnIndex != -1) { String storedPassword = cursor.getString(columnIndex); // 获取存储的密码 isPasswordCorrect = storedPassword.equals(password); //判断密码是否正确 } else { Log.e("DB_DEBUG", "COLUMN_PASSWORD column not found in the table."); } } cursor.close(); return isPasswordCorrect; } //获取身份(查找数据-user) public String getIdentity(String username) { SQLiteDatabase readableDatabase = this.getReadableDatabase(); Cursor cursor = readableDatabase.query( TABLE_NAME, new String[]{COLUMN_IDENTIFY}, COLUMN_NAME + " = ?", new String[]{username}, null, null, null ); String identity = ""; if (cursor.moveToFirst()) { int columnIndex = cursor.getColumnIndex(COLUMN_IDENTIFY); if (columnIndex != -1) { identity = cursor.getString(columnIndex); } } cursor.close(); return identity; } //插入数据(提问和回答-question&answer) public long insertQuestion(String content, String asker) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(QUESTION_CONTENT, content); values.put(QUESTION_ASKER, asker); return db.insert(QUESTIONS_TABLE_NAME, null, values); } public long insertAnswer(String content, String responder, long questionId) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(ANSWER_CONTENT, content); values.put(ANSWER_RESPONDER, responder); values.put(ANSWER_QUESTION_ID, questionId); return db.insert(ANSWERS_TABLE_NAME, null, values); } //查找与更新数据(点赞-answer) public void updateAnswerLikes(long answerId, int likes) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(ANSWER_LIKES, likes); db.update(ANSWERS_TABLE_NAME, values, ANSWER_ID + " = ?", new String[]{String.valueOf(answerId)}); } // 更新数据 public int updateItem(long id, String username, String identify) { ContentValues values = new ContentValues(); values.put(COLUMN_NAME, username); values.put(COLUMN_IDENTIFY, identify); return database.update( TABLE_NAME, values, COLUMN_ID + " = ?", new String[]{String.valueOf(id)} ); } } --- package db; public interface Common { void comment();//评论 void like();//点赞 } --- package db; public interface Questioner { void ask();//提问 void score();//评分 } --- package db; public class Person implements Common{ private long id; private String username; private String password; private String identify; public Person(long id, String username, String password, String identify) { this.id = id; this.username = username; this.password = password; this.identify=identify; }} -- package db; public class Student extends Person implements Questioner{ public Student(long id, String username, String password, String identify,String question) { super(id, username, password, identify); } @Override public void like(){//点赞 } @Override public void comment(){//评论 } @Override public void ask() {//提问 } @Override public void score() {//评分 } }
06-10
你更改后他还是不行。其实问题不止这个,还有很多很多,这个问题我想放到最后再去修改,在这之前有个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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值