安卓socket实例(五)安卓端界面设计优化,实现服务设置和动态返回

604 阅读2分钟

上一篇:安卓socket实例(四)确定目标系统模型,实现动态远程打开PC文件夹

下一篇:安卓socket实例(六)实现KEY操作,即热键操作

本更内容:

将安卓端界面进行精美设计,美化界面;设立服务设置功能,修改的服务会记忆下来,下次打开显示为最新修改的服务ip,port;实现动态返回按键,在动态访问pc目录时,可以实现动态返回上一级。

安卓Socket5.gif

服务端无变化

下期将开始更新KEY操作。

安卓端大变动

  • 使用android.content.SharedPreferences方法,可以将修改的数据再每次关闭程序再次打开时依然保存修改后的值,以此实现set服务需求。
  • 使用字符串处理方法增添动态返回效果按键,每次点击返回上一层目录,在最外层时提示已在最外层。
  • 进行页面设计,优化结构,美化设计,增加美感使得整体看起来更加高级,这里设计风格偏向简约,是我自己设计的,可以将参数直接拿去使用。

image.png

图标可以直接用我的也可以自己去网上找,大部分需要PS处理才可以达到使用要求。

这里我给出来,因为是和背景色一样,所以看不到,需要手动存入drawable中。

menu1.png

menu1.png

search.png

search.png

MainActivity

package com.example.android_app;

import androidx.appcompat.app.AppCompatActivity;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
import androidx.annotation.NonNull;
import android.os.Handler;
import android.os.Message;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    public static final String KEY_SERVER_ACK_MSG = "KEY_SERVER_ACK_MSG";
    private static final String KEY_IP="ip";
    private static final String KEY_PORT="port";
    private  Handler handler = null;
    EditText input;
    ListView lv;
    Button back;
    ImageView submit,opt_menu;
    SocketClient socketClient=null;
    String here;
    ArrayList<String> data;
    String ip;
    String port;
    TextView show_msg,here_msg;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initdata();

        input=findViewById(R.id.dir);
        lv=findViewById(R.id.listview);
        submit=findViewById(R.id.submit);
        opt_menu=findViewById(R.id.opt_menu);
        back=findViewById(R.id.back);
        show_msg=findViewById(R.id.show_msg);
        here_msg=findViewById(R.id.here_msg);

        handler=new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(@NonNull Message msg) {

                int fp=msg.arg2;
                Bundle data_bundle = msg.getData();
                if(fp==SocketClient.SERVER_MSG_DIR){
                    data=data_bundle.getStringArrayList(KEY_SERVER_ACK_MSG);
                    data=dataMaker();
                    printAdapter(data);
                    show_msg.setText("成功执行DIR操作");
                }else if(fp==SocketClient.SERVER_MSG_OPN){
                    show_msg.setText("成功执行OPN操作");
                }


                return false; }
        });


        opt_menu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showPopupMenu(v);
            }
        });

        submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String s_input=input.getText().toString();
                if (s_input.substring(0,4).equals("dir:")){
                    here=s_input.substring(4);
                    socketClient=new SocketClient(ip,Integer.parseInt(port),handler);
                    socketClient.work(s_input);
                    here_msg.setText("当前位置:"+here);
                }else {
                    socketClient=new SocketClient(ip,Integer.parseInt(port),handler);
                    socketClient.work(s_input);
                }
            }
        });

        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                int i=here.lastIndexOf("/");
                if (here.length()>4){
                    here=here.substring(0,i);
                    if (here.length()<4){
                        here=here+"/";
                    }
                    socketClient=new SocketClient(ip,Integer.parseInt(port),handler);
                    socketClient.work("dir:"+here);
                    here_msg.setText("当前位置:"+here);
                    show_msg.setText("成功返回上一层目录");
                }else {
                    show_msg.setText("已在最外层位置");
                    Toast.makeText(MainActivity.this,"已在最外层位置",Toast.LENGTH_SHORT).show();
                }
            }
        });

        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String s_here=here;
                int s_here_p=s_here.lastIndexOf("/");
                if (s_here_p==s_here.length()-1){
                    here=here.substring(0,s_here_p);
                }
                here=here+"/"+data.get(position);
                socketClient=new SocketClient(ip,Integer.parseInt(port),handler);
                socketClient.work("dir:"+here);
                here_msg.setText("当前位置:"+here);
            }
        });

        lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

                showDialog_list_main(MainActivity.this,data.get(position));
                return false;
            }
        });
    }


    private ArrayList<String> dataMaker() {
        ArrayList<String> dataResult=new ArrayList<>();
        int i=data.size();
        for (int j = 0; j <i ; j++) {
            String str=data.get(j);
            str=str.substring(0,str.indexOf(">"));
            dataResult.add(str);
        }

        return  dataResult;
    }


    private void printAdapter(ArrayList<String> data) {
        ArrayAdapter<String> arrayAdapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,data);
        lv.setAdapter(arrayAdapter);
    }


    public  void showDialog_list_main(final Context context, final String opn_name) {
        AlertDialog.Builder bl = new AlertDialog.Builder(context);
        bl.setTitle("文件操作");
        View v = LayoutInflater.from(context).inflate(R.layout.dialog_view_list, null, false);
        String s_opn=here;
        int s_opn_p=s_opn.lastIndexOf("/");
        if (s_opn_p==s_opn.length()-1){
            s_opn=s_opn.substring(0,s_opn_p);
        }
        System.out.println(s_opn);
        final String opn_dir="opn:"+s_opn+"/"+opn_name;

        final Button bt1=v.findViewById(R.id.opn);

        bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                socketClient=new SocketClient(ip,Integer.parseInt(port),handler);
                socketClient.work(opn_dir);

                String ss = opn_name+"即将在PC端打开";
                Toast.makeText(context,ss,Toast.LENGTH_SHORT).show();
            }
        });


        bl.setView(v);
        bl.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });
        bl.create().show();
    }

    private void showPopupMenu(final View view) {
        final PopupMenu popupMenu = new PopupMenu(this, view);
        //menu 布局
        popupMenu.getMenuInflater().inflate(R.menu.opt_menu, popupMenu.getMenu());
        //点击事件
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.to_set:
                        showDialog_opt_set(MainActivity.this);
                        break;
                }
                return false;
            }
        });
        //关闭事件
        popupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() {
            @Override
            public void onDismiss(PopupMenu menu) {
            }
        });
        //显示菜单,不要少了这一步
        popupMenu.show();
    }


    //ip,port设置初始化
    private void initdata() {
        SharedPreferences sharedPreferences= PreferenceManager.getDefaultSharedPreferences(this);
        ip=sharedPreferences.getString(KEY_IP,"10.218.216.10");
        port=sharedPreferences.getString(KEY_PORT,"8019");
    }
    //ip,port保存设置
    public void saveset(String c_ip, String c_port){
        ip=c_ip;
        port=c_port;
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(KEY_IP,ip);
        editor.putString(KEY_PORT,port);
        editor.apply();
    }
    //ip,port修改
    public void showDialog_opt_set(final Context context){

        AlertDialog.Builder bl = new AlertDialog.Builder(context);
        bl.setTitle("服务设置");
        View v = LayoutInflater.from(context).inflate(R.layout.dialog_view_opt_set, null, false);
        final EditText et1,et2;
        et1=v.findViewById(R.id.opt_set_ip);
        et2=v.findViewById(R.id.opt_set_port);
        et1.setText(ip);
        et2.setText(port);
        bl.setView(v);
        bl.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                saveset(et1.getText().toString(),et2.getText().toString());

                String s = "设置模式已关闭";
                Toast.makeText(context,s,Toast.LENGTH_SHORT).show();
            }
        });
        bl.create().show();
    }
}



SocketClient无变更

activity_main.xml 界面美化(layout)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="@color/bg_gray"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:padding="5dp"
        android:background="@color/bg_blue"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="horizontal">
        <ImageView
            android:layout_marginTop="14dp"
            android:layout_marginLeft="12dp"
            android:layout_marginRight="13dp"
            android:id="@+id/opt_menu"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:src="@drawable/menu1"/>
        <EditText
            android:paddingLeft="6dp"
            android:layout_width="0dp"
            android:layout_weight="5"
            android:layout_marginTop="6dp"
            android:height="36dp"
            android:background="@color/bg_white"
            android:layout_height="wrap_content"
            android:id="@+id/dir"
            android:text="dir:d://"/>

        <ImageView
            android:layout_marginTop="15dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="12dp"
            android:id="@+id/submit"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:src="@drawable/search"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/show_msg"
            android:layout_width="0dp"
            android:layout_weight="5"
            android:layout_height="wrap_content"
            android:text="show_msg" />
        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:id="@+id/back"
            android:text="back"/>
    </LinearLayout>


    <LinearLayout
        android:layout_marginTop="20dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:background="@color/bg_white"
        android:orientation="vertical">
        <TextView
            android:paddingLeft="10dp"
            android:paddingTop="10dp"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:textSize="18sp"
            android:textStyle="bold"
            android:id="@+id/here_msg"
            android:text="当前位置:" />
        <VideoView
            android:layout_width="match_parent"
            android:layout_height="0.5dp"
            android:background="#cccccc"/>
        <ListView
            android:padding="5dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/listview"
            android:divider="#CCCCCC"
            android:dividerHeight="2px"
            />
    </LinearLayout>
</LinearLayout>

dialog_view_list.xml 无变更(layout)

dialog_view_opt_set.xml (layout新增)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="  IP: "/>
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="192.168.43.12"
            android:id="@+id/opt_set_ip"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Port: "/>
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=""
            android:id="@+id/opt_set_port"/>
    </LinearLayout>
</LinearLayout>

opt_menu.xml (menu新增)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/to_set"
        android:title="设置"/>

</menu>

colors.xml 增添配色方案 (values)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#008577</color>
    <color name="colorPrimaryDark">#00574B</color>
    <color name="colorAccent">#D81B60</color>
    <color name="bg_blue">#3366ff</color>
    <color name="bg_white">#FFFFFF</color>
    <color name="bg_gray">#EEEEEE</color>
</resources>

styles.xml 修改主题框(values)

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>