短信APP多界面
程序员文章站
2022-03-11 15:42:02
...
一、要求
制作一个短信界面,可以点击进入不同的短信界面,长按可以删除,右上角点击有菜单。
二、关键得分点:
目录页面和内容界面的布局、两类页面间的跳转功能;选项菜单的布局、上下文菜单的布局和功能。
三、界面
(一会儿再贴图)
四、主要思路
- 设置了一个List界面为初始总界面,四个分别的短信界面,短信界面延续上一次作业的内容,稍作更改。
- 关于列表。使用SimpleAdapter,通过setOnItemClickListener实现单击某个item后实现界面跳转。其中,listItem为一个数组,保存每个item,listItemAdapter将listItem和其外观联系起来(这里我也不知道理解的对不对,暂且先这样子)。
//初始化listItem
listItem = new ArrayList<HashMap<String, Object>>();
//初始化一个SimpleAdapter
listItemAdapter = new SimpleAdapter(this, listItem, R.layout.item,
new String[]{"names", "messes", "dates","icons"},
new int[]{R.id.name, R.id.mess, R.id.time, R.id.image});
- 长按删除的上下文菜单。重写setOnCreateContextMenuListener和onContextItemSelected,通过listItem.remove()实现删除item的操作。
- 右上角的菜单。使用轻量化组件 PopupMenu,没有用老师要求的选项菜单,因为用选项菜单的话就要改标题栏的设置,既然找到了更简便的方法我就用了。如果用选项菜单的话我的基本设想是更改标题栏的背景为白色,标题为信息,然后直接套课上练习chp302中的选项菜单部分就行了。
五、代码
1.List.java
package dhu.cst.liyiqing181310505.message;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class List extends AppCompatActivity {
private ListView mList;
int sum=4;
// ListView的适配器
SimpleAdapter listItemAdapter;
// ListView的数据源,这里是一个HashMap的列表
ArrayList<HashMap<String, Object>> listItem;
//列表中的内容
private String[] names={"10086","同学A","同学B","同学C"};
private String[] messes={"【中国移动】流量提醒:尊敬的客户,您好!您本月套餐流量已使用1GB,剩余12GB。","你这周还有几节课啊?","周末去哪里玩呀?","Android的作业里的列表怎么自定义样式?"};
private String[] dates={"20:00","20:00","21:30","22:25"};
private int[] icons={R.drawable.head,R.drawable.head,R.drawable.head,R.drawable.head};
private int [] l={0,1,2,3};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
//初始化listItem
listItem = new ArrayList<HashMap<String, Object>>();
//初始化一个SimpleAdapter
listItemAdapter = new SimpleAdapter(this, listItem, R.layout.item,
new String[]{"names", "messes", "dates","icons"},
new int[]{R.id.name, R.id.mess, R.id.time, R.id.image});
//为上面的listItemAdapter赋值
for (int i=0;i<4;i++){
HashMap<String,Object> showitem=new HashMap<String, Object>();
showitem.put("names",names[i]);
showitem.put("messes",messes[i]);
showitem.put("dates",dates[i]);
showitem.put("icons",icons[i]);
listItem.add(showitem);
}
//初始化mList
mList = findViewById(R.id.list);
mList.setAdapter(listItemAdapter);
/***跳转页面***/
mList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent=new Intent();
//l[position]为删除某个消息框后,现存的item所对应的消息框(确保点击跳转页面不会错乱)
switch (l[position]){
case 0:
intent.setClass(getApplicationContext(), MainActivity.class);
List.this.startActivity(intent);
break;
case 1:
intent.setClass(getApplicationContext(), stu_1.class);
List.this.startActivity(intent);
break;
case 2:
intent.setClass(getApplicationContext(), stu_2.class);
List.this.startActivity(intent);
break;
case 3:
intent.setClass(getApplicationContext(), stu_3.class);
List.this.startActivity(intent);
break;
}
}
});
/***上下文菜单方法的长按监听***/
mList.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
//contextMenu.setHeaderTitle("title");//菜单的标题,这里不需要
contextMenu.add(Menu.NONE, 0, 0, "删除");
}
});
/***右上角选项菜单***/
final ImageView imageVie = findViewById(R.id.more);
imageVie.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showPopupMenu(imageVie);
}
});
}
/***点击上下文菜单项后要做的事(选中菜单Item后触发)***/
public boolean onContextItemSelected(MenuItem item){
AdapterView.AdapterContextMenuInfo menuInfo;
menuInfo =(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
switch (item.getItemId()){
case 0:
//定义一个pos表示当前选中的item在mList中的位置
int pos=(int)mList.getAdapter().getItemId(menuInfo.position);
//在listItem中将pos位置的内容移除
listItem.remove(pos);
//通过l数组记录每个item对应的消息框,每次都要更新一遍,并且总数sum-1
for (int i=pos;i<sum-1;i++)
l[i]=l[i+1];
sum--;
//更新listItem的表单
listItemAdapter.notifyDataSetChanged();
break;
}
return super.onContextItemSelected(item);
}
/***轻量化组件 PopupMenu 的使用***/
private void showPopupMenu(View view) {
// View当前PopupMenu显示的相对View的位置
PopupMenu popupMenu = new PopupMenu(this, view);
// menu布局
popupMenu.getMenuInflater().inflate(R.menu.main, popupMenu.getMenu());
// menu的item点击事件
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
//点击动作
return false;
}
});
popupMenu.show();
}
}
2.任意一个短信界面的java
package dhu.cst.liyiqing181310505.message;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private EditText shuru;
private TextView xianshi;
private ImageButton btsend;
private ImageButton btBack;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
shuru = findViewById(R.id.shuru);
xianshi = findViewById(R.id.xianshi);
btsend = findViewById(R.id.btsend);
btBack = findViewById(R.id.goback);
xianshi.setVisibility(xianshi.GONE);
btsend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
xianshi.setVisibility(xianshi.VISIBLE);
xianshi.setText(shuru.getText().toString());
}
});
//返回按钮,返回List列表界面
btBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, List.class);
MainActivity.this.startActivity(intent);
}
});
}
}
3.activity_list.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=".List">
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="407dp"
android:layout_height="66dp"
android:layout_marginEnd="2dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/textView"
android:layout_width="322dp"
android:layout_height="53dp"
android:layout_margin="10dp"
android:layout_weight="1"
android:text="信息"
android:textColor="#000000"
android:textSize="40dp" />
<ImageButton
android:id="@+id/more"
style="?android:attr/borderlessButtonStyle"
android:layout_margin="10dp"
android:layout_width="26dp"
android:layout_height="wrap_content"
android:layout_weight="1"
app:srcCompat="@drawable/more" />
</LinearLayout>
<ListView
android:id="@+id/list"
android:layout_width="409dp"
android:layout_height="678dp"
android:layout_marginEnd="2dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/linearLayout"
app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
4.ListView中item的xml布局
<?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"
android:paddingBottom="15dp"
>
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_marginStart="15dp"
android:layout_marginTop="15dp"
android:layout_marginBottom="5dp" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:layout_marginEnd="155dp"
android:layout_toEndOf="@+id/image"
android:paddingLeft="15dp"
android:textColor="#000000"
android:textSize="18sp" />
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginStart="85dp"
android:layout_marginTop="15dp"
android:layout_toEndOf="@+id/name"
android:textSize="14sp" />
<TextView
android:id="@+id/mess"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/name"
android:layout_alignBottom="@+id/name"
android:layout_marginTop="0dp"
android:layout_marginBottom="-24dp"
android:hint="我是ListView的Item布局"
android:layout_toEndOf="@+id/image"
android:paddingLeft="15dp"
android:textSize="18sp" />
</RelativeLayout>
5.PopupMenu
PopupMenu需要建立一个Menu的文件夹,其中有一个main.xml为显示的菜单的布局。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add"
android:title="编辑信息" />
<item
android:id="@+id/remove"
android:title="选择信息" />
</menu>
六、tips
- 设置切换页面后不重新加载原界面(删除某条短信,再查看别的短信,返回后仍是删除后的样子)。在Manifest文件中设置:
<activity android:name=".List"
android:launchMode = "singleTask"/>
上一篇: Box重启IPO:云端之战伤了谁?
下一篇: 植物录用APP
推荐阅读
-
[Phonegap+Sencha Touch] 移动开发24 打包wp8.1的App,运行时输入框聚焦弹出软键盘之后,界面上移而不恢复原位的解决办法
-
iOS APP 多服务器环境分离的方法
-
AE制作APP界面gif动画效果
-
Android界面设计(APP设计趋势 左侧隐藏菜单右边显示content)
-
多闪app如何发红包?多闪app拍视频红包发送教程
-
Android笔记之:App应用之启动界面SplashActivity的使用
-
iOS APP 多服务器环境分离的方法
-
多闪app如何使用?多闪app使用攻略
-
Android仿拉手网团购App我的收藏界面实例代码
-
Android仿拉手网团购App产品详情界面效果