赞
踩
在 MainActivity
中实现用户登录功能,首先创建一个布局文件 activity_main.xml
包含用户名和密码的输入字段以及登录按钮。
<!-- activity_main.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> <EditText android:id="@+id/editTextUsername" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="用户名" /> <EditText android:id="@+id/editTextPassword" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="密码" android:inputType="textPassword" /> <Button android:id="@+id/buttonLogin" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登录" /> </LinearLayout>
实现效果
在Android Studio中,右键点击项目的app
目录,选择“New” > “Activity” > “Empty Activity”。
布局文件 activity_product_list.xml
用于显示商品列表。
<!-- activity_product_list.xml -->
<ListView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/listViewProducts"
android:layout_width="match_parent"
android:layout_height="match_parent" />
实现效果
然后,在 ProductListActivity.java
中加载商品数据并显示在 ListView
中。
import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; import androidx.appcompat.app.AppCompatActivity; public class ProductListActivity extends AppCompatActivity { private ListView listViewProducts; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_product_list); listViewProducts = findViewById(R.id.listViewProducts); // 在这里获取商品数据,可以从网络或本地获取 // 假设你有一个商品列表的字符串数组 String[] products = {"商品1", "商品2", "商品3", "商品4"}; // 使用ArrayAdapter将商品数据绑定到ListView ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, products); listViewProducts.setAdapter(adapter); } }
然后在 MainActivity.java
中处理登录逻辑,验证用户名和密码是否正确。在成功登录后,跳转到商品列表页面。
package com.leo.login_filestore; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import androidx.appcompat.app.AppCompatActivity; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private EditText editTextUsername; private EditText editTextPassword; private Button buttonLogin; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextUsername = findViewById(R.id.editTextUsername); editTextPassword = findViewById(R.id.editTextPassword); buttonLogin = findViewById(R.id.buttonLogin); buttonLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 在这里验证用户名和密码是否正确 String username = editTextUsername.getText().toString(); String password = editTextPassword.getText().toString(); if (isValidCredentials(username, password)) { // 登录成功,跳转到商品列表页面 startActivity(new Intent(MainActivity.this, ProductListActivity.class)); } else { // 登录失败,显示错误消息 Toast.makeText(MainActivity.this, "登录失败,用户名或密码不正确", Toast.LENGTH_SHORT).show(); } } }); } private boolean isValidCredentials(String username, String password) { // 在这里实现验证逻辑,比较输入的用户名和密码是否正确 // 这里可以将用户名和密码写在代码中或从其他数据源获取 // 用户名和密码硬编码在代码中,用于演示 String validUsername = "user"; String validPassword = "password"; // 比较输入的用户名和密码与有效的用户名和密码是否匹配 return username.equals(validUsername) && password.equals(validPassword); } }
实现效果
要请求外部存储权限,你需要在 AndroidManifest.xml
中添加权限声明。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:ignore="WrongManifestParent" />
创建一个 SaveUtil.java
类来处理数据保存到外部存储的逻辑。
使用 Environment.getExternalStorageDirectory() 来获取外部存储的根目录,然后创建一个文件并将数据写入其中。这将使你的代码更加灵活,因为它动态获取了外部存储的路径,而不是硬编码路径。请确保在使用外部存储时处理好权限问题。
package com.leo.login_filestore; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import android.os.Environment; public class SaveUtil { public static boolean saveDataToExternalStorage(String filename, String data) { // 在这里实现数据保存到外部存储的逻辑 // 注意要处理异常情况 try { // 获取外部存储根目录 File root = Environment.getExternalStorageDirectory(); // 创建要保存的文件 File file = new File(root, filename); // 创建文件输出流 FileOutputStream fos = new FileOutputStream(file); // 写入数据 fos.write(data.getBytes()); // 关闭文件输出流 fos.close(); return true; } catch (IOException e) { e.printStackTrace(); return false; } } }
在登录成功后,调用 SaveUtil
类保存用户名和密码到外部存储。这里我们使用模拟数据,实际情况下应该更加安全地保存密码。
存储的默认目录:
/storage/emulated/0/你的文件
// 登录成功后
if (isValidCredentials(username, password)) {
// 保存用户名和密码到外部存储
boolean saved = SaveUtil.saveDataToExternalStorage("credentials.txt", username + "," + password);
if (saved) {
// 跳转到商品列表页面
startActivity(new Intent(MainActivity.this, ProductListActivity.class));
} else {
// 处理保存失败的情况
}
}
还需要在 MainActivity
中请求权限。通常,这会在应用的运行时动态请求。
完整代码
package com.leo.login_filestore; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.Manifest; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private static final int PERMISSION_REQUEST_CODE = 1; private EditText editTextUsername; private EditText editTextPassword; private String username; private String password; private Button buttonLogin; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextUsername = findViewById(R.id.editTextUsername); editTextPassword = findViewById(R.id.editTextPassword); buttonLogin = findViewById(R.id.buttonLogin); // 请求外部存储权限 requestStoragePermission(); buttonLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 在这里验证用户名和密码是否正确 username = editTextUsername.getText().toString(); password = editTextPassword.getText().toString(); if (isValidCredentials(username, password)) { // 登录成功,跳转到商品列表页面 startActivity(new Intent(MainActivity.this, ProductListActivity.class)); saveDataToExternalStorage(); } else { // 登录失败,显示错误消息 Toast.makeText(MainActivity.this, "登录失败,用户名或密码不正确", Toast.LENGTH_SHORT).show(); } } }); } private void requestStoragePermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 请求权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE); } } private void saveDataToExternalStorage() { System.out.println(username + "," + password); // 可以使用FileOutputStream等方式 boolean saved = SaveUtil.saveDataToExternalStorage("credentials.txt", username + "," + password); } private boolean isValidCredentials(String username, String password) { // 在这里实现验证逻辑,比较输入的用户名和密码是否正确 // 这里可以将用户名和密码写在代码中或从其他数据源获取 // 用户名和密码硬编码在代码中,用于演示 String validUsername = "user"; String validPassword = "password"; // 比较输入的用户名和密码与有效的用户名和密码是否匹配 return username.equals(validUsername) && password.equals(validPassword); } }
实现效果
存储到虚拟机文件中的内容——/storage/emulated/0/credentials.txt
当前我们已经实现了保存用户名和密码到外部存储的逻辑。接下来,需要修改 MainActivity
,在启动应用时尝试读取 credentials.txt
文件中的用户名和密码,并实现自动登录。
private static final String CREDENTIALS_FILE = "credentials.txt"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ... // 尝试自动登录 tryAutoLogin(); } private void tryAutoLogin() { String savedCredentials = readDataFromExternalStorage(CREDENTIALS_FILE); if (savedCredentials != null) { String[] parts = savedCredentials.split(","); if (parts.length == 2) { String savedUsername = parts[0]; String savedPassword = parts[1]; // 检查保存的用户名和密码是否与有效凭据匹配 if (isValidCredentials(savedUsername, savedPassword)) { // 自动登录成功,跳转到商品列表页面 startActivity(new Intent(MainActivity.this, ProductListActivity.class)); } } } } private String readDataFromExternalStorage(String filename) { try { File root = Environment.getExternalStorageDirectory(); File file = new File(root, filename); if (file.exists()) { FileInputStream fis = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis); BufferedReader bufferedReader = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { sb.append(line); } bufferedReader.close(); return sb.toString(); } } catch (IOException e) { e.printStackTrace(); } return null; }
上述代码在 onCreate
中调用了 tryAutoLogin
方法,该方法会尝试从 credentials.txt
文件中读取保存的用户名和密码,然后检查它们是否与有效凭据匹配。如果匹配成功,它将执行自动登录并跳转到商品列表页面。
请确保在
AndroidManifest.xml
中添加适当的权限声明以及在 Android 11 及更高版本上正确处理存储权限。
实现自动登录效果
我们使用SharedPreferences
来保存和检索用户名和密码。tryAutoLogin
方法尝试从SharedPreferences中获取保存的凭据,并自动登录用户,如果凭据存在并有效的话。
确保在 ProductListActivity
中实现商品列表的显示,这部分代码应该保持不变。
代码如下:
import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private EditText editTextUsername; private EditText editTextPassword; private Button buttonLogin; private SharedPreferences sharedPreferences; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextUsername = findViewById(R.id.editTextUsername); editTextPassword = findViewById(R.id.editTextPassword); buttonLogin = findViewById(R.id.buttonLogin); sharedPreferences = getSharedPreferences("MyAppPrefs", MODE_PRIVATE); tryAutoLogin(); buttonLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String username = editTextUsername.getText().toString(); String password = editTextPassword.getText().toString(); if (isValidCredentials(username, password)) { // 登录成功,保存用户名和密码到SharedPreferences saveCredentials(username, password); // 跳转到商品列表页面 startActivity(new Intent(MainActivity.this, ProductListActivity.class)); } else { // 登录失败,显示错误消息 Toast.makeText(MainActivity.this, "登录失败,用户名或密码不正确", Toast.LENGTH_SHORT).show(); } } }); } private void tryAutoLogin() { String savedUsername = sharedPreferences.getString("username", ""); String savedPassword = sharedPreferences.getString("password", ""); if (!savedUsername.isEmpty() && !savedPassword.isEmpty()) { // 自动登录成功,跳转到商品列表页面 startActivity(new Intent(MainActivity.this, ProductListActivity.class)); } } private void saveCredentials(String username, String password) { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("username", username); editor.putString("password", password); editor.apply(); } private boolean isValidCredentials(String username, String password) { // 在这里实现验证逻辑,比较输入的用户名和密码是否正确 // 这里可以将用户名和密码写在代码中或从其他数据源获取 // 示例:用户名和密码硬编码在代码中,用于演示 String validUsername = "user"; String validPassword = "password"; // 比较输入的用户名和密码与有效的用户名和密码是否匹配 return username.equals(validUsername) && password.equals(validPassword); } }
MainActivity完整代码
package com.leo.login_filestore; /** 使用内部存储文件和SharedPreferences实现自动登录功能 **/ import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private EditText editTextUsername; private EditText editTextPassword; private Button buttonLogin; private SharedPreferences sharedPreferences; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextUsername = findViewById(R.id.editTextUsername); editTextPassword = findViewById(R.id.editTextPassword); buttonLogin = findViewById(R.id.buttonLogin); sharedPreferences = getSharedPreferences("MyAppPrefs", MODE_PRIVATE); tryAutoLogin(); buttonLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String username = editTextUsername.getText().toString(); String password = editTextPassword.getText().toString(); if (isValidCredentials(username, password)) { // 登录成功,保存用户名和密码到SharedPreferences saveCredentials(username, password); // 跳转到商品列表页面 startActivity(new Intent(MainActivity.this, ProductListActivity.class)); } else { // 登录失败,显示错误消息 Toast.makeText(MainActivity.this, "登录失败,用户名或密码不正确", Toast.LENGTH_SHORT).show(); } } }); } private void tryAutoLogin() { String savedUsername = sharedPreferences.getString("username", ""); String savedPassword = sharedPreferences.getString("password", ""); if (!savedUsername.isEmpty() && !savedPassword.isEmpty()) { // 自动登录成功,跳转到商品列表页面 startActivity(new Intent(MainActivity.this, ProductListActivity.class)); } } private void saveCredentials(String username, String password) { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("username", username); editor.putString("password", password); editor.apply(); } private boolean isValidCredentials(String username, String password) { // 在这里实现验证逻辑,比较输入的用户名和密码是否正确 // 这里可以将用户名和密码写在代码中或从其他数据源获取 // 示例:用户名和密码硬编码在代码中,用于演示 String validUsername = "user"; String validPassword = "password"; // 比较输入的用户名和密码与有效的用户名和密码是否匹配 return username.equals(validUsername) && password.equals(validPassword); } } /** # 外部存储实现自动登录 **/ // //import android.content.Intent; //import android.content.pm.PackageManager; //import android.os.Bundle; //import android.os.Environment; //import android.view.View; //import android.widget.Button; //import android.widget.EditText; // //import android.Manifest; // //import androidx.annotation.NonNull; //import androidx.appcompat.app.AppCompatActivity; //import androidx.core.app.ActivityCompat; //import androidx.core.content.ContextCompat; //import android.widget.Toast; // //import java.io.BufferedReader; //import java.io.File; //import java.io.FileInputStream; //import java.io.IOException; //import java.io.InputStreamReader; // //public class MainActivity extends AppCompatActivity { // private static final int PERMISSION_REQUEST_CODE = 1; // private static final String CREDENTIALS_FILE = "credentials.txt"; // // // private EditText editTextUsername; // private EditText editTextPassword; // // private String username; // private String password; // // private Button buttonLogin; // // @Override // protected void onCreate(Bundle savedInstanceState) { // super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); // // editTextUsername = findViewById(R.id.editTextUsername); // editTextPassword = findViewById(R.id.editTextPassword); // buttonLogin = findViewById(R.id.buttonLogin); // // 请求外部存储权限 // requestStoragePermission(); // // tryAutoLogin(); // // buttonLogin.setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View v) { // // // 在这里验证用户名和密码是否正确 // username = editTextUsername.getText().toString(); // password = editTextPassword.getText().toString(); // // if (isValidCredentials(username, password)) { // // 登录成功,跳转到商品列表页面 // startActivity(new Intent(MainActivity.this, ProductListActivity.class)); // saveDataToExternalStorage(); // } else { // // 登录失败,显示错误消息 // Toast.makeText(MainActivity.this, "登录失败,用户名或密码不正确", Toast.LENGTH_SHORT).show(); // } // } // }); // } // private void requestStoragePermission() { // // if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) // != PackageManager.PERMISSION_GRANTED) { // // 请求权限 // ActivityCompat.requestPermissions(this, // new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, // PERMISSION_REQUEST_CODE); // } // } // // private void saveDataToExternalStorage() { // System.out.println(username + "," + password); // // 可以使用FileOutputStream等方式 // boolean saved = SaveUtil.saveDataToExternalStorage("credentials.txt", username + "," + password); // // } // // private boolean isValidCredentials(String username, String password) { // // 在这里实现验证逻辑,比较输入的用户名和密码是否正确 // // 这里可以将用户名和密码写在代码中或从其他数据源获取 // // // 用户名和密码硬编码在代码中,用于演示 // String validUsername = "user"; // String validPassword = "password"; // // // 比较输入的用户名和密码与有效的用户名和密码是否匹配 // return username.equals(validUsername) && password.equals(validPassword); // } // // private void tryAutoLogin() { // String savedCredentials = readDataFromExternalStorage(CREDENTIALS_FILE); // if (savedCredentials != null) { // String[] parts = savedCredentials.split(","); // if (parts.length == 2) { // String savedUsername = parts[0]; // String savedPassword = parts[1]; // // // 检查保存的用户名和密码是否与有效凭据匹配 // if (isValidCredentials(savedUsername, savedPassword)) { // // 自动登录成功,跳转到商品列表页面 // startActivity(new Intent(MainActivity.this, ProductListActivity.class)); // } // } // } // } // // private String readDataFromExternalStorage(String filename) { // try { // File root = Environment.getExternalStorageDirectory(); // File file = new File(root, filename); // // if (file.exists()) { // FileInputStream fis = new FileInputStream(file); // InputStreamReader isr = new InputStreamReader(fis); // BufferedReader bufferedReader = new BufferedReader(isr); // // StringBuilder sb = new StringBuilder(); // String line; // while ((line = bufferedReader.readLine()) != null) { // sb.append(line); // } // // bufferedReader.close(); // return sb.toString(); // } // } catch (IOException e) { // e.printStackTrace(); // } // // return null; // } // //}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。