QQ登陆界面的布局文件源代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/default_bg" ><LinearLayout android:id="@+id/linearLayout01" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" ><RelativeLayout android:id="@+id/relativeLayout" android:background="@drawable/login_back" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="60.0dip" android:layout_marginLeft="15.0dip" android:layout_marginRight="15.0dip" android:paddingTop="20.0dip" android:paddingLeft="10.0dip" android:paddingRight="10.0dip" > <ImageView android:id="@+id/imageView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/qq_layouts" /> <EditText android:id="@+id/qq_acount" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="45.0dip" android:paddingRight="35.0dip" android:layout_toRightOf="@id/imageView01" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:inputType="number" android:hint="@string/input_acount" android:textSize="15sp" android:background="@drawable/input" /> <TextView android:text="@string/acount" android:gravity="center" android:paddingLeft="8dip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@id/qq_acount" android:layout_alignLeft="@id/qq_acount" android:layout_alignBottom="@id/qq_acount" /> <ImageButton android:id="@+id/imageButton01" android:clickable="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@id/qq_acount" android:layout_alignTop="@id/qq_acount" android:layout_alignBottom="@id/qq_acount" android:background="@drawable/more_selected" /> <EditText android:id="@+id/qq_password" android:inputType="textPassword" android:paddingLeft="45dip" android:layout_below="@id/qq_acount" android:layout_alignParentRight="true" android:layout_alignLeft="@id/qq_acount" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/input" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@id/qq_password" android:layout_alignTop="@id/qq_password" android:layout_alignBottom="@id/qq_password" android:paddingLeft="8dip" android:gravity="center" android:text="@string/password" android:textSize="15sp" /> <CheckBox android:id="@+id/checkBox01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/imageView01" android:layout_alignParentLeft="true" android:layout_marginTop="15.0dip" android:text="@string/rememberPassword" android:checked="true" android:button="@drawable/check" /> <CheckBox android:id="@+id/checkBox02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@id/checkBox01" android:layout_alignParentRight="true" android:layout_marginRight="15.0dip" android:text="@string/autoLogin" android:checked="false" android:button="@drawable/check" /> <Button android:id="@+id/btn01" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/checkBox01" android:layout_marginLeft="50.0dip" android:layout_marginRight="50.0dip" android:text="@string/login" android:textSize="15sp" /></RelativeLayout><TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20.0dip" android:layout_marginRight="20.0dip" android:stretchColumns="1" > <TableRow> <CheckBox android:id="@+id/checkBox03" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/unvisibleLogin" android:button="@drawable/check" /> <CheckBox android:id="@+id/checkBox04" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/openVibration" android:button="@drawable/check" android:layout_gravity="right" /> </TableRow> <TableRow> <CheckBox android:id="@+id/checkBox05" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/receiveMsg" android:button="@drawable/check" /> <CheckBox android:id="@+id/checkBox06" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="静音登陆" android:layout_gravity="right" android:button="@drawable/check" /> </TableRow></TableLayout></LinearLayout><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10.0dip" android:background="@drawable/bottom" > <ImageButton android:id="@+id/imageButton02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/option" /></LinearLayout></LinearLayout>
其中用到的图片需要放在drawable文件夹下。strings.xml文件内容:
<?xml version="1.0" encoding="utf-8"?><resources> <string name="hello">Hello World, QQLoginActivity!</string> <string name="app_name">QQLogin2</string> <string name="input_acount">请输入账号</string> <string name="acount">账号</string> <string name="rememberPassword">记住密码</string> <string name="autoLogin">自动登陆</string> <string name="password">密码</string> <string name="login">登陆</string> <string name="unvisibleLogin">隐身登陆</string> <string name="openVibration">开启振动</string> <string name="receiveMsg">接收群消息</string></resources>
如果要保存上次登陆的QQ账号可使用类SharedPreferences实现,大概代码如下:
//文件QQLoginActivity.java
package com.qqlogin2;
import java.util.LinkedHashSet;import java.util.Set;
import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.os.Bundle;import android.view.Gravity;import android.view.KeyEvent;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.widget.CheckBox;import android.widget.EditText;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.PopupWindow;import android.widget.Toast;
public class QQLoginActivity extends Activity { private CheckBox rememberPassword ; private EditText etAcount; private EditText etPassword; private ImageView option; private PopupWindow pop; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login); rememberPassword = (CheckBox) findViewById(R.id.checkBox01); etAcount = (EditText) findViewById(R.id.qq_acount); etPassword = (EditText) findViewById(R.id.qq_password); option = (ImageView) findViewById(R.id.imageButton02); init(); initPop(); option.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(!pop.isShowing()){ pop.showAtLocation(v, Gravity.BOTTOM, 0, 50); }else{ pop.dismiss(); } } }); /* dropdown.setOnClickListener(new OnClickListener(){
@Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(QQLoginActivity.this,"dropdown", Toast.LENGTH_SHORT).show(); AlertDialog.Builder builder = new AlertDialog.Builder(QQLoginActivity.this); builder.setTitle("choose acount"); final String[] acounts = null; builder.setSingleChoiceItems(acounts, -1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub String acountSpec = acounts[which]; etAcount.setText(acountSpec); dialog.dismiss(); } }); builder.create().show(); }});*/ } private void initPop(){ View view = getLayoutInflater().inflate(R.layout.pop, null); pop = new PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); ImageButton quit = (ImageButton) view.findViewById(R.id.quit); quit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(QQLoginActivity.this, "quit", Toast.LENGTH_SHORT).show(); finish(); } }); } protected void init() { // TODO Auto-generated method stub super.onResume(); SharedPreferences preferences = getSharedPreferences("qq", Context.MODE_WORLD_READABLE); String acount = preferences.getString("acount", ""); String password = preferences.getString("password", ""); boolean isRemember = preferences.getBoolean("isRemember", true); rememberPassword.setChecked(isRemember); if(!acount.equals("")){ etAcount.setText(acount); } if(!password.equals("")){ etPassword.setText(password); } } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Set<String> stringSet = new LinkedHashSet<String>(); SharedPreferences preferences = getSharedPreferences("qq", Context.MODE_PRIVATE); Editor editor = preferences.edit(); boolean isChecked = rememberPassword.isChecked(); editor.putBoolean("isRemember", isChecked); String acount = etAcount.getText().toString().trim(); if(!acount.equals("") ){ editor.putString("acount", acount); stringSet.add(acount); if(rememberPassword.isChecked()){ String password = etPassword.getText().toString(); editor.putString("password", password); } else{ editor.putString("password", ""); } editor.commit(); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode==KeyEvent.KEYCODE_MENU){ if(pop.isShowing()){ pop.dismiss(); }else{ pop.showAtLocation(option, Gravity.BOTTOM, 0, 50); } return true; } else if(keyCode==KeyEvent.KEYCODE_BACK){ if(pop.isShowing()){ pop.dismiss(); } else{ AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("确定要退出程序吗"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub finish(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); } }); builder.show(); } return true; } else{ return super.onKeyDown(keyCode, event); } }}