欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

短信APP多界面

程序员文章站 2022-03-11 15:42:02
...

一、要求

制作一个短信界面,可以点击进入不同的短信界面,长按可以删除,右上角点击有菜单。

二、关键得分点:

目录页面和内容界面的布局、两类页面间的跳转功能;选项菜单的布局、上下文菜单的布局和功能。

三、界面

(一会儿再贴图)

四、主要思路

  1. 设置了一个List界面为初始总界面,四个分别的短信界面,短信界面延续上一次作业的内容,稍作更改。
  2. 关于列表。使用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});
  1. 长按删除的上下文菜单。重写setOnCreateContextMenuListener和onContextItemSelected,通过listItem.remove()实现删除item的操作。
  2. 右上角的菜单。使用轻量化组件 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

短信APP多界面

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

  1. 设置切换页面后不重新加载原界面(删除某条短信,再查看别的短信,返回后仍是删除后的样子)。在Manifest文件中设置:
<activity android:name=".List"
            android:launchMode = "singleTask"/>