这一学期要结束了,我用Android写了一个音乐播放器,算是给它画上个完美的句号,里面有登录,注册,这个APP还有很多功能没完善,有时间了在加一些料。效果图如下:
登录、注册直接用的是Android自带的SQLite数据库,点击com.exammyapplicationple——>new——>Package写一个Service包,自建的User,DatabaseHelper两个Java类,点击Service——>new——>Service中写,创建UserService,点击Java——>new——>Activity——>Empty Activity建两个登录、注册的Activity。因为Android默认是先启动MainActivity,所以要在AndroidManifest里面更换MainActivity和LoginActivity的位置,换完之后代码截图:
User代码
import java.io.Serializable; public class User implements Serializable { private int id; private String username; private String password; public User() { super(); // TODO Auto-generated constructor stub } public User(String username, String password) { super(); this.username = username; this.password = password; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", password=" + password + "]"; } } DatabaseHelper代码
package com.example.myapplication.Service; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DatabaseHelper extends SQLiteOpenHelper { static String name="user.db"; static int dbVersion=1; public DatabaseHelper(Context context){ super(context,name,null,dbVersion); } @Override public void onCreate(SQLiteDatabase db) { String sql="create table user(id integer primary key autoincrement,username varchar(20),password varchar(20))"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } UserService代码
package com.example.myapplication.Service; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.example.myapplication.User; public class UserService { private DatabaseHelper dbHelper; public UserService(Context context){ dbHelper=new DatabaseHelper(context); } public boolean login(String username,String password){ SQLiteDatabase sdb=dbHelper.getReadableDatabase(); String sql="select * from user where username=? and password=?"; Cursor cursor=sdb.rawQuery(sql, new String[]{username,password}); if(cursor.moveToFirst()==true){ cursor.close(); return true; } return false; } public boolean register(User user){ SQLiteDatabase sdb=dbHelper.getReadableDatabase(); String sql="insert into user(username,password) values(?,?)"; Object obj[]={user.getUsername(),user.getPassword()}; sdb.execSQL(sql, obj); return true; } } login页面布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/back" android:orientation="vertical"> <!--显示头像,这里把头像定为了固定图像,这里完全可以为每个账户挑选各自的头像--> <ImageView android:id="@+id/iv_head" android:layout_width="70dp" android:layout_height="70dp" android:layout_marginTop="25dp" android:layout_gravity="center_horizontal" android:background="@drawable/go_back"/> <!--输入框--> <EditText android:id="@+id/et_user_name" android:layout_width="fill_parent" android:layout_height="48dp" android:layout_marginTop="35dp" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:layout_gravity="center_horizontal" android:background="@drawable/login_user_name_bg" android:drawableLeft="@drawable/ic_baseline_person_24" android:drawablePadding="10dp" android:paddingLeft="8dp" android:gravity="center_vertical" android:hint="请输入用户名" android:singleLine="true" android:textColor="#000000" android:textColorHint="#a3a3a3" android:textSize="14sp"/> <!--输入框--> <EditText android:id="@+id/et_psw" android:layout_width="fill_parent" android:layout_height="48dp" android:layout_gravity="center_horizontal" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:background="@drawable/login_psw_bg" android:drawableLeft="@drawable/ic_lock" android:drawablePadding="10dp" android:paddingLeft="8dp" android:gravity="center_vertical" android:hint="请输入密码" android:inputType="textPassword" android:singleLine="true" android:textColor="#000000" android:textColorHint="#a3a3a3" android:textSize="14sp"/> <!--上面inputType设置为textPassword,在输入密码时就会隐藏密码 --> <!--按钮--> <Button android:id="@+id/btn_login" android:layout_width="fill_parent" android:layout_height="40dp" android:layout_marginTop="15dp" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:layout_gravity="center_horizontal" android:background="@drawable/register_selector" android:text="登 录" android:textColor="@android:color/white" android:textSize="18sp"/> <Button android:id="@+id/btn_register" android:layout_width="fill_parent" android:layout_height="40dp" android:layout_marginTop="30dp" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:layout_gravity="center_horizontal" android:background="@drawable/register_selector" android:text="注 册" android:textColor="@android:color/white" android:textSize="18sp"/> </LinearLayout> register <?xml version="1.0" encoding="utf-8"?> <!--注册界面--> <!--这里的布局放置是: 1 个 ImageView 控件,用于显示用户头像;3 个 EditText 控件,用于输入用户名、密码、再次输入密码;1 个 Button 控件为注册按钮--> <!--修改 activity_register.xml 为 LinearLayout 布局--> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_register" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/register_pwd" android:orientation="vertical"> <include layout="@layout/main_title_bar"></include><!--引入标题栏--> <ImageView android:layout_width="70dp" android:layout_height="70dp" android:layout_gravity="center_horizontal" android:layout_marginTop="25dp" android:src="@drawable/x"/> <!--三个编辑框--> <EditText android:id="@+id/et_user_name" android:layout_width="fill_parent" android:layout_height="48dp" android:layout_gravity="center_horizontal" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:layout_marginTop="35dp" android:background="@drawable/login_user_name_bg" android:drawableLeft="@drawable/ic_baseline_person_24" android:drawablePadding="10dp" android:gravity="center_vertical" android:hint="请输入用户名" android:paddingLeft="8dp" android:singleLine="true" android:textColor="#000000" android:textColorHint="#a3a3a3" android:textSize="14sp"/> <EditText android:id="@+id/et_psw" android:layout_width="fill_parent" android:layout_gravity="center_horizontal" android:layout_height="48dp" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:background="@drawable/login_user_name_bg" android:drawableLeft="@drawable/ic_lock" android:drawablePadding="10dp" android:hint="请输入密码" android:inputType="textPassword" android:paddingLeft="8dp" android:singleLine="true" android:textColor="#000000" android:textColorHint="#a3a3a3" android:textSize="14sp"/> <EditText android:id="@+id/et_psw_again" android:layout_width="fill_parent" android:layout_height="48dp" android:layout_gravity="center_horizontal" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:background="@drawable/login_user_name_bg" android:drawableLeft="@drawable/ic_lock" android:drawablePadding="10dp" android:hint="请再次输入密码" android:inputType="textPassword" android:paddingLeft="8dp" android:singleLine="true" android:textColor="#000000" android:textColorHint="#a3a3a3" android:textSize="14sp"/> <Button android:id="@+id/btn_register" android:layout_width="fill_parent" android:layout_height="40dp" android:layout_gravity="center_horizontal" android:layout_marginLeft="35dp" android:layout_marginRight="35dp" android:layout_marginTop="15dp" android:background="@drawable/register_selector" android:text="注 册" android:textColor="@android:color/white" android:textSize="18sp"/> </LinearLayout>
因为要实现登录与注册跳转,引入main_title_bar.xml,代码如下:
<?xml version="1.0" encoding="utf-8"?> <!--标题栏与返回键的创建,独立在main_title_bar.xml中--> <!--标题栏设置高度为50dp,宽度为match_parent,设置背景颜色为透明 @android:color/transparent--> <!--RelativeLayout为相对布局--> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/title_bar" android:layout_width="match_parent" android:layout_height="50dp" android:background="@android:color/transparent"> <!--设置返回键TextView为高度50dp,宽度为50dp;id为android:id="@+id/tv_back"--> <!--layout_alignParentLeft为与父控件左对齐--> <!--layout_centerVertical为控件垂直居中--> <!--标题栏界面中的返回键在按下与弹起时,返回键会有明显的区别,这种效果通过背景选择器进行实现--> <TextView android:id="@+id/tv_back" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:background="@drawable/ic_back"/> <!--设置id为android:id="@+id/tv_main_title--> <!--该TextView为显示文本--> <!--layout_centerInparent为居中显示--> <TextView android:id="@+id/tv_main_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/white" android:textSize="20sp" android:layout_centerInParent="true"/> </RelativeLayout>
login后台
package com.example.myapplication; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.example.myapplication.Service.UserService; public class LoginActivity extends AppCompatActivity { private EditText username; private EditText password; private Button login; private Button register; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); findViews(); } private void findViews() { username=(EditText) findViewById(R.id.et_user_name); password=(EditText) findViewById(R.id.et_psw); login=(Button) findViewById(R.id.btn_login); register=(Button) findViewById(R.id.btn_register); login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String name=username.getText().toString(); System.out.println(name); String pass=password.getText().toString(); System.out.println(pass); Log.i("TAG",name+"_"+pass); UserService uService=new UserService(LoginActivity.this); boolean flag=uService.login(name, pass); if(flag){ Log.i("TAG","登录成功"); Toast.makeText(LoginActivity.this,"登录成功", Toast.LENGTH_LONG).show(); Intent intent = new Intent(LoginActivity.this,MainActivity.class); startActivity(intent); }else{ Log.i("TAG","登录失败"); Toast.makeText(LoginActivity.this, "登录失败", Toast.LENGTH_LONG).show(); } } }); register.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent intent=new Intent(LoginActivity.this,RegisteredActivity.class); startActivity(intent); } }); } }
register后台
package com.example.myapplication; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.*; import com.example.myapplication.Service.UserService; public class RegisteredActivity extends AppCompatActivity { EditText username; EditText password; Button register; TextView iv_back; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_registered); findViews(); register.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String name=username.getText().toString().trim(); String pass=password.getText().toString().trim(); Log.i("TAG",name+"_"+pass); UserService uService=new UserService(RegisteredActivity.this); User user=new User(); user.setUsername(name); user.setPassword(pass); uService.register(user); Toast.makeText(RegisteredActivity.this, "注册成功", Toast.LENGTH_LONG).show(); } }); } private void findViews() { username=(EditText) findViewById(R.id.et_user_name); password=(EditText) findViewById(R.id.et_psw); register=(Button) findViewById(R.id.btn_register); iv_back = (TextView)findViewById(R.id.tv_back); iv_back.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent intent = new Intent(RegisteredActivity.this, LoginActivity.class); startActivity(intent); } }); } }
因为我这个有三个页面,所以要写3个fragment,main页面布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical" android:background="@color/white"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="@color/teal_200"> <TextView android:id="@+id/menu1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="歌曲" android:textSize="25dp"/> <TextView android:id="@+id/menu2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="歌手" android:textSize="25dp"/> <TextView android:id="@+id/menu3" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="弹奏" android:textSize="25dp"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="150dp" android:orientation="horizontal" android:background="@drawable/li"> </LinearLayout> //引入fragment <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="9"> </FrameLayout> </LinearLayout>
MainActivity后台
package com.example.myapplication; import android.annotation.SuppressLint; import android.content.ContentResolver; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { //创建需要用到的控件的变量 private TextView tv1,tv2,tv3; private FragmentManager fm; private FragmentTransaction ft; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //绑定控件 tv1=(TextView)findViewById(R.id.menu1); tv2=(TextView)findViewById(R.id.menu2); tv3=(TextView)findViewById(R.id.menu3); //设置监听器,固定写法 tv1.setOnClickListener(this); tv2.setOnClickListener(this); tv3.setOnClickListener(this); //若是继承FragmentActivity,fm=getFragmentManger(); fm=getSupportFragmentManager(); //fm可以理解为Fragment显示的管理者,ft就是它的改变者 ft=fm.beginTransaction(); //默认情况下就显示frag1 ft.replace(R.id.content,new frag1()); //提交改变的内容 ft.commit(); } @Override //控件的点击事件 public void onClick(View v){ ft=fm.beginTransaction(); //切换选项卡 switch (v.getId()){ case R.id.menu1: ft.replace(R.id.content,new frag1()); break; case R.id.menu2: ft.replace(R.id.content,new frag2()); break; case R.id.menu3: ft.replace(R.id.content,new frag3()); break; default: break; } ft.commit(); } }