上一篇:安卓socket实例(四)确定目标系统模型,实现动态远程打开PC文件夹
下一篇:安卓socket实例(六)实现KEY操作,即热键操作
本更内容:
将安卓端界面进行精美设计,美化界面;设立服务设置功能,修改的服务会记忆下来,下次打开显示为最新修改的服务ip,port;实现动态返回按键,在动态访问pc目录时,可以实现动态返回上一级。
服务端无变化
下期将开始更新KEY操作。
安卓端大变动
- 使用android.content.SharedPreferences方法,可以将修改的数据再每次关闭程序再次打开时依然保存修改后的值,以此实现set服务需求。
- 使用字符串处理方法增添动态返回效果按键,每次点击返回上一层目录,在最外层时提示已在最外层。
- 进行页面设计,优化结构,美化设计,增加美感使得整体看起来更加高级,这里设计风格偏向简约,是我自己设计的,可以将参数直接拿去使用。
图标可以直接用我的也可以自己去网上找,大部分需要PS处理才可以达到使用要求。
这里我给出来,因为是和背景色一样,所以看不到,需要手动存入drawable中。
menu1.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>