Android组件开发01——ViewPage+RadioGroup实现欢迎页组件

一、布局

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();
    }



}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值