一、布局
1.轮播欢迎页
欢迎页由一下四个部分组成,没有IP设置可以忽略IP设置按钮
- ViewPage:用于存放切换页面
- RadioGroup:切换按钮
- TextView:网络IP设置按钮
- Button:进入首页按钮
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:id="@+id/tvInternet"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.WelcomeActivity">
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.viewpager.widget.ViewPager>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="网络配置"
android:textColor="#fff"
android:textSize="24dp"
android:layout_centerHorizontal="true"
android:layout_above="@id/btnIndex"
/>
<Button
android:id="@+id/btnIndex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnIndexClick"
android:text="进入主页"
android:layout_centerHorizontal="true"
android:layout_above="@id/ll_welcome"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="50dp"
android:id="@+id/ll_welcome"
>
<RadioGroup
android:id="@+id/rdGroup"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<RadioButton
android:id="@+id/rd1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<RadioButton
android:id="@+id/rd2"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<RadioButton
android:id="@+id/rd3"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<RadioButton
android:id="@+id/rd4"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<RadioButton
android:id="@+id/rd5"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RadioGroup>
</LinearLayout>
</RelativeLayout>
2.设置IP对话框布局(可忽略)
由两部分组成:
- IP输入
- 端口输入
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:text="IP地址:"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
<EditText
android:id="@+id/txtIp"
android:hint="192.168.1.1"
android:layout_width="300dp"
android:layout_height="wrap_content">
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:text="端口号:"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
<EditText
android:id="@+id/txtPort"
android:hint="8080"
android:layout_width="300dp"
android:layout_height="wrap_content">
</EditText>
</LinearLayout>
</LinearLayout>
二、功能
1.保存设置的前置要求(可忽略)
1)App类
import android.app.Application;
import android.content.Context;
/**
* 此类用于创建上下文对象
*/
public class App extends Application {
public static Context context;
@Override
public void onCreate() {
super.onCreate();
context=getApplicationContext();
}
}
2)SpHelper类
import android.content.SharedPreferences;
import com.neu.App;
/**
* 此类用于操作SharedPreferences存储对象
*/
public class SpHelper {
// 存储配置的sp文件名
private final static String FILE_NAME="config";
/**
* 获得config对象里面的指定参数
* @param name 参数名
* @return 参数
*/
public static String getString(String name){
return getStSp().getString(name,"");
}
/**
* 设置ShardPreferences
* @param name key值
* @param value value值
*/
public static void setString(String name,String value){
SharedPreferences sp=getStSp();
SharedPreferences.Editor editor=getStSp().edit();
editor.putString(name,value);
editor.commit();
}
/**
* 获得SharedPreferences 对象
* @return 获得配置的对象如ID地址端口号
*/
private static SharedPreferences getStSp(){
return App.context.getSharedPreferences(FILE_NAME,App.context.MODE_PRIVATE);
}
}
2.轮播图欢迎页(可忽略一些IP设置的代码)
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.neu.App;
import com.neu.MainActivity;
import com.neu.R;
import com.neu.util.SpHelper;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
public class WelcomeActivity extends AppCompatActivity {
// 滑动ViewPager
private ViewPager viewPager;
// 网络配置文本对象
private TextView textView;
// 单选按钮组
private RadioGroup rdGroup;
// 单选按钮列表
private int[] rbs = {R.id.rd1, R.id.rd2, R.id.rd3, R.id.rd4, R.id.rd5};
// 进入首页按钮
private Button btnIndex;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
// 获得名为first的参数
String first=SpHelper.getString("first");
// 比较是否是第一次进入
if("first".equals(first)){
// SharedPreferences里面config中包含first参数
Intent intent=new Intent(this,MainActivity.class);
// 直接进入主页
startActivity(intent);
// 销毁当前页
finish();
}
// 初始化当前轮播图页
initView();
}
// 这里写你要跳转的首页
public void btnIndexClick(View view) {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}
private void initView() {
viewPager = (ViewPager) findViewById(R.id.viewPager);
textView = (TextView) findViewById(R.id.textView);
rdGroup = (RadioGroup) findViewById(R.id.rdGroup);
viewPager.setAdapter(new PagerAdapter() {
// 图片列表
private int[] imgs = {R.drawable.a1, R.drawable.a2, R.drawable.a3, R.drawable.a4, R.drawable.a5};
/**
* 重写方法 加载每个页面出现的对象
* @param container 父布局
* @param position 当前位置
* @return 对象
*/
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
// 创建图片
ImageView pic = new ImageView(getApplicationContext());
// 设置类型——居中显示?
pic.setScaleType(ImageView.ScaleType.CENTER_CROP);
// 设置图片
pic.setImageResource(imgs[position]);
// 添加进容器对象
container.addView(pic);
return pic;
}
/**
* 销毁
* @param container
* @param position
* @param object
*/
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
// 删除创建的对象
container.removeView((View) object);
}
@Override
public int getCount() {
return imgs.length;
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return object == view;
}
});
// 添加监听
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// 单选按钮选中项改变
rdGroup.check(rbs[position]);
if (position + 1 == 5) {
// 最后一页显示设置对象
textView.setVisibility(View.VISIBLE);
btnIndex.setVisibility(View.VISIBLE);
}else{
// 前面几页隐藏设置对象
textView.setVisibility(View.GONE);
btnIndex.setVisibility(View.GONE);
}
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
btnIndex = (Button) findViewById(R.id.btnIndex);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
setIp();
}
});
}
//设置IP
private void setIp() {
// 创建对话框
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("设置IP和端口号");
// 创建IP输入view
View view=getLayoutInflater().inflate(R.layout.dialog_ip,null);
// 获得输入框对象
final EditText txtIp=view.findViewById(R.id.txtIp);
final EditText txtPort=view.findViewById(R.id.txtPort);
// 设置view
builder.setView(view);
// 设置保存按钮
builder.setPositiveButton("保存",null);
// 创建对话框
final AlertDialog dialog=builder.create();
// 显示对话框
dialog.show();
// 获得保存按钮对象,设置监听
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 判断IP地址是否合法
if(!isboolIp(txtIp.getText().toString())){
Toast.makeText(App.context,"IP格式错误",Toast.LENGTH_LONG).show();
// 错误重新输入,聚焦
txtIp.setFocusable(true);
}else{
if("".equals(txtPort.getText().toString())){
Toast.makeText(App.context,"端口不能为空",Toast.LENGTH_LONG).show();
txtIp.setFocusable(false);
// 端口输入框聚焦
txtPort.setFocusable(true);
}else{
//保存http://+ip+:+port
String url="http://"+txtIp.getText().toString()+":"+txtPort.getText().toString();
// 存入 SharedPreferences
SpHelper.setString("url",url);
Log.d("TAG", "onClick: "+SpHelper.getString("url"));
//设置第一次已完成,后面不在弹出welcome
SpHelper.setString("first","first");
//关闭dialog
dialog.dismiss();
}
}
}
});
}
// 判断是否是IP地址
private boolean isboolIp(String ipAddress) {
// 正则匹配是否是ip地址
String ip = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}";
// 添加匹配器
Pattern pattern = Pattern.compile(ip);
// 正则匹配IP
Matcher matcher = pattern.matcher(ipAddress);
// 返回匹配的结果
return matcher.matches();
}
}