Android入门攻略(另附一个简单的带socket的模仿QQ实例)

2024-02-29 19:30

本文主要是介绍Android入门攻略(另附一个简单的带socket的模仿QQ实例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        开头声明一下,这是本人在2017年暑假学的一些皮毛,写给想android入门的人看一看,不是讲android的原理铺路什么的,就是让你从0开始能够简单的写一个自己的android工程,希望对你有所帮助,如有不足请留言指正,感谢(不想看入门的想直接看粗糙仿制qq的请移步到低端)。

一、环境搭建--android

Android是基于java 的编程,个人习惯用eclipse来进行编写,所以一下也均基于eclipse

1、安装java环境并设置环境变量(这个网上的教程比较多在此就不多赘述)

2、安装eclipse

64位版本:http://mirrors.neusoft.edu.cn/eclipse/technology/epp/downloads/release/oxygen/R/eclipse-jee-oxygen-R-win32-x86_64.zip

32位版本:http://mirrors.neusoft.edu.cn/eclipse/technology/epp/downloads/release/oxygen/R/eclipse-jee-oxygen-R-win32.zip

解压之后就直接可以用了

3、安装Android SDK和为eclipse添加ADT插件(网上教程很多,不多赘述)

   配置成功会在eclipse出现以下图标


以下是我的SDK配置


安装api版本为19

二、一个简单的android实例

1、新建一个android project(由于个人习惯用API 19

   File->New->Android Application Project(如果没有这一project选项,点击otherandroid中选择)(如果other中也没有请重新配置android环境)


注意SDK版本最低的minimum不要低于android4.0,下边选择适应自己api版本的,在此选择api19的,然后一直next直到finishi

2、新建一个android模拟器


点击这个图标,弹出窗口中点击create,新建一个模拟器


这是我的一个模拟器的配置

3、运行project

点击你的项目后单击运行图标(一个类似播放的按钮)然后选择刚刚新建的模拟器,等待模拟器运行开机


这就是刚刚新建的project的运行实例,helloword

接下来就分析一下这个project

 

三、实例解析


这是新建的androidproject目录,每次新建一个androidproject都会自动生成一个activityactivity就可以理解成是一个页面,每个activity包含一个在res\layout下的.xml文件和一个在src下的.java文件

 

接下来让我们简单看看这个activity

1、打开res->layout->activity_main.xml

 

点击左下角的两个按钮会切换,左边的图片是页面的效果图,能直接看到页面的样式,而右边则是该页面的代码文件,改变左右任意一个另一个均会作出相应改变,这里只是对页面的视图进行控制(一定要自己也跟着做,最好每一步都熟悉完再进行下一步,不要着急)

 

2、打开src目录里边的MainActivity.java

在这个类中的onCreate函数中setContentView(R.layout.activity_main);就表示与刚才的.xml文件进行了关联,在这里进行页面的控制代码书写

 

3、在工程目录中有一个AndroidManifest.xml文件,打开如图

这里边每新建一个activity都会在这里进行注册(这是在新建activity时候自动生成的基本用不到自己改),其中包含以下代码的视为是改工程的起始页面

<intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

        </intent-filter>

可以自己把这串代码拖到自己想定义的起始页面的栏中去

 

以上三点就是一个activity的基本的三个元素,下面让我们做一个稍微复杂的工程吧

 

四、新实例

1、预计实现功能:两个页面,页面上分别有一个按钮,点击跳转到另一个页面

2、新建一个activity

右键刚刚的project,选择new->other->Android->Android Activity然后一直next直到如下页面


定义新的activity的名字,此处为SecondActivity,然后finish,可以看到src目录下和res->layout下分别自动生成了一个文件


这就是我们刚刚新建的activity,打开AndroidManifest.xml文件也会看到该activity的注册信息

 

1、为页面添加控件:

打开activity_main.xml文件,在视图界面的左侧边栏中


找到圈中的Button鼠标点住,拖动到页面中去(任意位置)


这个Button就是新建的按钮,双击按钮到按钮的代码处,这里可以看到


当然你也可以直接在代码界面写上这样一堆代码,视图界面也会自动添加一个相应的按钮

这就是刚刚新建的按钮的代码,分析一下,id属性就是他的特定名称,方便在此activity.java文件中调用,widthheight为该控件的宽高,text为该控件的文本内容,其他的先暂且不看,打开该activity相对应的.java文件MainActivity.javasrc目录下),修改为以下内容:


public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//绑定页面中的按钮Button b1 = (Button)findViewById(R.id.button1);//给按钮设置监听和点击事件b1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//点击事件在此//跳转到SecondActivityIntent intent = new Intent(MainActivity.this, SecondActivity.class);startActivity(intent);}});}
}

这样第一个页面就完成了,然后第二个页面同理仿照第一个页面加入一个按钮,并在.java文件中引用设置监听(每个控件的id需要唯一,不同的Activity中的控件id也不能一样)

SecondActivity.java

public class SecondActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);//绑定页面中的按钮Button b1 = (Button)findViewById(R.id.button2);//给按钮设置监听和点击事件b1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//点击事件在此//跳转到SecondActivityIntent intent = new Intent(SecondActivity.this, MainActivity.class);startActivity(intent);}});}
}

可以看到与MainActivity.java一样只是引用的id不同,跳转页面的代码不一样

至此,新的简单实例就完成了(由于是最基础的页面就没有过多美化尽可能简单制作)

运行工程,效果如下:


到这里android的基本操作,就介绍完了,内容包括新建activity,添加控件,给控件设置点击事件,页面跳转,接下来就开始详细的阐述一下

 

五、Android的界面的基础控件

1、布局的使用:

所谓布局就是整个页面里边的东西要按什么规则来进行摆放,你是要竖着摆还是横着摆还是先竖着再横着摆,他也是控件的一种


这一个界面中,最外边套的一层就是布局,布局之中也可以在继续套另一个布局,随意你想套几个套几个

下面介绍三个基础的布局:

A、自由布局RelativeLayout这个布局的限制比较少,你可以直接在视图界面中在整个布局中把控件随意拖动放置,自由度较高,但相对的不容易适应不同大小的屏幕,之前的两个实例中的布局都是自由布局

B、Linearlayoutlinearlayout又分横向布局(Horizontal)和纵向布局(Vertical)顾名思义,一个是横着摆,另一个是竖着摆

举个例子:

代码:

<RelativeLayout 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="com.example.myfirstandroid.SecondActivity" ><LinearLayoutandroid:id="@+id/linearLayout1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="#EE2C2C"android:orientation="vertical" ><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button" /><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button" /></LinearLayout><LinearLayoutandroid:id="@+id/linearLayout2"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_below="@+id/linearLayout1"android:background="#CAE1FF"android:orientation="horizontal" ><Buttonandroid:id="@+id/button4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button" /><Buttonandroid:id="@+id/button5"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button" /><Buttonandroid:id="@+id/button6"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button" /></LinearLayout>
</RelativeLayout>

效果图:


可以看到,代码中是一个自由布局中嵌套了一个横向布局(蓝色)和纵向布局(红色),每个布局中加入了三个按钮,三个按钮摆放如图,Linearlayout设置横向还是纵向布局要看android:orientation="vertical"这个属性,为vertical就是纵向,为horizontal就为横向,不设置自动默认为横向

C、覆盖布局framelayout顾名思义就是控件之间会相互覆盖,也是经常会用到的布局

 

2、简单控件的使用

打开视图界面:


可以看到左侧这一栏都是控件,都可以通过拖动到视图中来进行添加控件,也可以直接在代码界面自己手动编辑

A、TextView文本显示框,用于显示文字;

B、Button按钮用于和用户进行交互,用户点击按钮触发事件,例如发送消息、返回、跳转等等;

C、EditText文本输入框,用于用户输入文字

D、ImageView图片显示框,用于显示图片(图片一般放在res->drawable目录下,引用的时候用R.drawable.+图片的名字,就可以了,注意,图片的命名很重要,不能首字母大写,也不能用一些return之类的关键词,否则会报错)

E、ImageButton图片按钮,原理和Button一样,其实没有多大差别,Button也可以设置图片背景

例子:

代码:

<RelativeLayout 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="com.example.myfirstandroid.MainActivity" ><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="我是一个TextView" /><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/textView1"android:layout_below="@+id/textView1"android:layout_marginTop="22dp"android:text="我是一个Button" /><EditTextandroid:id="@+id/editText1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/button1"android:layout_below="@+id/button1"android:layout_marginTop="20dp"android:text="我是一个输入框"android:ems="10" ><requestFocus /></EditText><ImageViewandroid:id="@+id/imageView1"android:layout_width="100dp"android:layout_height="100dp"android:layout_alignLeft="@+id/editText1"android:layout_below="@+id/editText1"android:layout_marginTop="15dp"android:src="@drawable/捕获" /><ImageButtonandroid:id="@+id/imageButton1"android:layout_width="100dp"android:layout_height="100dp"android:layout_alignLeft="@+id/imageView1"android:layout_below="@+id/imageView1"android:layout_marginTop="28dp"android:background="@drawable/捕获" /><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignRight="@+id/editText1"android:layout_centerVertical="true"android:text="←这是ImageView" /><TextViewandroid:id="@+id/textView3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/textView2"android:layout_alignTop="@+id/imageButton1"android:layout_marginTop="34dp"android:text="←这是ImageButton" /></RelativeLayout>

界面效果:

其实不只是按钮可以设置点击事件,每一个控件都能设置监听Onclicklistener,并设置点击事件,就连布局layout也可以设置点击事件。

以上几个就是最最常用到的控件了

 

六、Android的逻辑层

Android的逻辑层就是该工程的类似算法一样的东西,你的project怎么运行,点击会有什么事情发生都在这里边写,打开src目录下包中的MainActivity.java文件

他的第一个函数onCreate函数,就是在该Activity即该页面刚加载就触发的函数,其中

setContentView(R.layout.activity_main);表示关联相应的视图文件,如果你是按照我说的方法新建的activity这些都会自动生成

比较常用的是一个监听接口和关联页面内的控件

譬如关联页面内的一个按钮:


Button b1 = (Button)findViewById(R.id.button1);
//改变按钮的文字:
b1.setText("改变了按钮上的文字");
//按钮设置监听:
b1.setOnClickListener(new OnClickListener() {	@Overridepublic void onClick(View v) {// TODO Auto-generated method stubLog.d("MainActivity", "点击了按钮");}});

另一种监听

public class MainActivity extends Activity implements OnClickListener{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button b1 = (Button)findViewById(R.id.button1);b1.setText("改变了按钮上的文字");b1.setOnClickListener(this);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.button1:	Log.d("MainActivity", "点击了按钮");break;default:break;}}
}

如果按钮多的话建议用第二中方法设置监听,美观还方便整理,点击idbutton1 的按钮后就会在控制台Logcat中打印出"点击了按钮"信息。

 

做一个简单实例,模拟一个登陆的页面,需要输入用户名和密码(随意输入即可)

activity_mian.xml:

<?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="#ffffff"android:orientation="vertical" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="50dp"android:layout_marginTop="60dp"android:text="用户名:" /><EditTextandroid:id="@+id/editText1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="10dp"android:ems="10"android:inputType="textPersonName" /><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="50dp"android:layout_marginTop="10dp"android:text="密码:" /><EditTextandroid:id="@+id/editText2"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="10dp"android:ems="10"android:inputType="textPassword" ></EditText><Buttonandroid:id="@+id/button1"style="@style/AppTheme"android:layout_width="match_parent"android:layout_height="35dp"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="20dp"android:text="登录"android:textSize="20sp" /></LinearLayout></LinearLayout>

MainActivity.java:

public class MainActivity extends Activity implements OnClickListener{private EditText name,password;private Button login;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);name = (EditText)findViewById(R.id.editText1);password = (EditText)findViewById(R.id.editText2);login = (Button)findViewById(R.id.button1);
login.setOnClickListener(this);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.button1:	SecondActivity.name = name.getText().toString();Intent intent = new Intent(MainActivity.this, SecondActivity.class);startActivity(intent);break;default:break;}}
}

activity_second.xml:

<RelativeLayout 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="com.example.myfirstandroid.SecondActivity" ><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_centerHorizontal="true"android:layout_marginTop="79dp"android:text="Large Text"android:textAppearance="?android:attr/textAppearanceLarge" /><Buttonandroid:id="@+id/back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignRight="@+id/name"android:layout_below="@+id/name"android:layout_marginTop="36dp"android:text="返回登录" /></RelativeLayout>

SecondActivity.java:

public class SecondActivity extends Activity implements OnClickListener{public static String name = "";private Button b1;private TextView t1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);t1 = (TextView)findViewById(R.id.name);//改变t1的文字t1.setText("欢迎你"+name);b1 = (Button)findViewById(R.id.back);b1.setOnClickListener(this);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.back://结束当前页面SecondActivity.this.finish();break;default:break;}}	
}

效果预览:



一个模拟的简单登陆就弄好了,是不是很简单!

七、Listview

1Listview也是一个控件,之所以单独把他拿出来说一说是因为个人觉得比较重要且相对复杂一点。

首先,Listview是什么,他是一个表单,像qq中的好友列表,你手机中的联系人列表,短信列表,就连朋友圈的动态列表等等都是listview

然后我们试着新建一个listview,很简单

布局代码:

<ListView
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/listView1"android:layout_width="match_parent"android:layout_height="match_parent">
</ListView>

一个lisiview就新建成功了

他是这样的:


里边每一个item都代表他的一个儿子;

接下来我们要新建一个listview中每个儿子的样子,在layout文件夹下新建一个item.xml文件,代码:

<?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:orientation="horizontal" ><ImageViewandroid:id="@+id/imageView1"android:layout_width="70dp"android:layout_height="75dp"android:layout_marginLeft="20dp"android:layout_marginTop="5dp"android:src="@drawable/捕获" /><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_marginTop="20dp"android:text="我是一个item"android:textAppearance="?android:attr/textAppearanceLarge" /></LinearLayout>
视图:


这样item的样式就做好了,接下来就要在逻辑层面来书写编辑这个listview

 

MainActivity.java:

public class MainActivity extends Activity implements OnItemClickListener{private ListView newlist;private List<HashMap<String, Object>> Data = new ArrayList<HashMap<String, Object>>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//为listview新建一个数据源initData();//绑定listview控件newlist = (ListView)findViewById(R.id.listView1);//新建一个适配器SimpleAdapter sim_adapter = new SimpleAdapter(this,Data, R.layout.item,new String[] { "content" },new int[] { R.id.content});//listview设置适配器newlist.setAdapter(sim_adapter);//listview每一个item设置监听newlist.setOnItemClickListener(this);}public void initData(){for(int i=0;i<20;i++){HashMap<String, Object> map = new HashMap<String, Object>();map.put("content", "我是第"+(i+1)+"个");Data.add(map);}}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//点击item触发该函数,view返回的是该item的视图,position返回的是该item在listview是第几个,id顾名思义// TODO Auto-generated method stub//弹窗提示点击的是第几个itemToast.makeText(MainActivity.this,"点击了第"+(position+1)+"个item", Toast.LENGTH_SHORT).show();;}
}

这样一个listview就完成了,下面是效果预览:




2、为listview添加下拉刷新组件SwipeRefreshLayout(需要引入android.support.v4.jar,引入方法:在项目根目录新建一个lib文件夹,把包移动到这个文件夹下,然后右键项目->Build Path->configure Build Path,然后左侧选择Java Build Path,中间选择Libraries->Add JARs,选择刚才路径下的包,然后设置成这个样子:

,就完成了引入包)

然后看一下布局文件activity_main.xml

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/SwipeRefreshLayout"android:layout_width="match_parent"android:layout_height="wrap_content" ><ListViewandroid:id="@+id/listView1"android:layout_width="match_parent"android:layout_height="match_parent" ></ListView>
</android.support.v4.widget.SwipeRefreshLayout>

只是在listview外边包裹了一个SwipeRefreshLayout控件就可以了

下面来看逻辑层的代码MainActivvity.java:

public class MainActivity extends Activity implements OnItemClickListener{private ListView newlist;private SimpleAdapter sim_adapter;private SwipeRefreshLayout swiperefreshlayout;private List<HashMap<String, Object>> Data = new ArrayList<HashMap<String, Object>>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//为listview新建一个数据源initData();//绑定listview控件newlist = (ListView)findViewById(R.id.listView1);//新建一个适配器sim_adapter = new SimpleAdapter(this,Data, R.layout.item,new String[] { "content" },new int[] { R.id.content});//listview设置适配器newlist.setAdapter(sim_adapter);//listview每一个item设置监听newlist.setOnItemClickListener(this);//关联下拉刷新控件swiperefreshlayout = (SwipeRefreshLayout)findViewById(R.id.SwipeRefreshLayout);swiperefreshlayout.setColorScheme( //给刷新控件添加颜色android.R.color.holo_blue_light, android.R.color.holo_green_light, android.R.color.holo_orange_light,android.R.color.holo_red_light);//设置监听swiperefreshlayout.setOnRefreshListener(new OnRefreshListener() {@Overridepublic void onRefresh() {// TODO Auto-generated method stub//下拉后执行这里的代码//修改数据源addData();//更新适配器sim_adapter.notifyDataSetChanged();//结束刷新swiperefreshlayout.setRefreshing(false);}});}public void initData(){for(int i=0;i<20;i++){HashMap<String, Object> map = new HashMap<String, Object>();map.put("content", "我是第"+(i+1)+"个");Data.add(map);}}public void addData(){Data.clear();int num = (int) (Math.random()*20);for(int i=0;i<num;i++){HashMap<String, Object> map = new HashMap<String, Object>();map.put("content", "更新后的数据有"+num+"个");Data.add(map);}}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//点击item触发该函数,view返回的是该item的视图,position返回的是该item在listview是第几个,id顾名思义// TODO Auto-generated method stub//弹窗提示点击的是第几个itemToast.makeText(MainActivity.this,"点击了第"+(position+1)+"个item", Toast.LENGTH_SHORT).show();}
}

可以看到与之前的代码也只是添加了刷新的一部分而已其余并无改动。

效果预览:



八、进阶篇

好了,我们已经熟悉了android的基本操作和基础的控件,下面我们来进行高级一点的,做出一个实际的东西,就做一个简单的仿制qq吧;

1、首先要知道要做那几个页面:登录界面,主界面(三个分页面:聊天列表,联系人列表,还有一个功能列表),右划拉出抽屉界面,聊天界面,个人资料界面,,还有一些杂七杂八的功能控件,这个在做界面的时候讲解。(由于自己做而且是当做例子,就没有太细致的做,还望看客轻喷,素材都是在这个网站上找的http://www.iconfont.cn/home/index?spm=a313x.7781069.1998910419.1,数据都是自己定义在本地的假数据)

里边附带一个socket一对一聊天的功能,登陆后开启一个serviceconnectservice.java)用于连接服务器,服务器包名(QQserver

构图:(画图画的略简陋)


工程名QQcopy

1、登录界面LoginActivity(LoginActivity.java,activity_login.xml)

登录界面,这个界面难度不大,就不太多说了,需要注意的只有一个按钮的样式(边角圆滑,触摸反馈),触摸反馈其实就是给按钮定义一个作为背景的.xml文件,按压的时候是一张图片,不按压又是一张图片,按钮代码:

 <Buttonandroid:id="@+id/login_button1"android:layout_width="match_parent"android:layout_height="40dp"android:background="@drawable/loginbuttonstyle"android:textColor="#ffffff"android:text="登陆" />

Loginbuttonstyle.xml:

<?xml version="1.0" encoding="utf-8"?>  
<selector xmlns:android="http://schemas.android.com/apk/res/android"><!-- 设置按钮按下去的效果,实际上就是不同的图片 --><item android:drawable="@drawable/loginbuttonstyleunpress" android:state_pressed="false"></item><item android:drawable="@drawable/loginbuttonstylepress" android:state_pressed="true"></item></selector>

Loginbuttonstyleunpress.xml:

<?xml version="1.0" encoding="utf-8"?>  
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">  <item>  <shape android:shape="rectangle">   <solid android:color="#5CACEE" />  <corners  android:topLeftRadius="3dip"  android:topRightRadius="3dip"  android:bottomLeftRadius="3dip"  android:bottomRightRadius="3dip" />  </shape>  </item>  
</layer-list>

Loginbuttonstylepress.xml:

<?xml version="1.0" encoding="utf-8"?>  
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">  <item>  <shape android:shape="rectangle">   <solid android:color="@color/blue" />  <corners  android:topLeftRadius="3dip"  android:topRightRadius="3dip"  android:bottomLeftRadius="3dip"  android:bottomRightRadius="3dip" />  </shape>  </item>  
</layer-list>

3.主界面MainActivity(MainActivity.java,activity_main.xml)

    这个界面用到的主要有DrawerLayout(抽屉),FrameLayout(分页),Popwindow(弹窗),重写listview的适配器adapter,还有一个和listview很像的ExpandableListView(点击可展开的listview)

抽屉很简单,具体看我这篇博客(http://blog.csdn.net/qq_33399371/article/details/76285772

分页同上(http://blog.csdn.net/qq_33399371/article/details/76285779

弹窗同上(http://blog.csdn.net/qq_33399371/article/details/75042652

重写适配器http://blog.csdn.net/qq_33399371/article/details/76285726

看不懂的同学也没关系,在我的工程中这些代码都有注释,实在不行复制下来自己改改看看就回了


4、聊天界面(ChatActivity.java,activity_chat.xml

主要是一个listview,里边item示意图:


接收到的消息的item就把下边的隐藏掉,发送的消息显示的item是把上边的部分隐藏掉

5、socket聊天

   (服务器端,内含一个客户端测试类)链接:http://pan.baidu.com/s/1nvfwh3F 密码:gxk9 (maven工程,不懂的自己简单百度下)

里边包含服务器的代码和一个简单的测试类(要聊天的话需要执行此工程中server包中startserver.java文件,并保持运行,在android工程的connecserver.java中把ip改为服务器的ip地址,即局域网的ip

6、总结,时间紧迫做的比较粗糙,只是仿照qq做了几个简单的页面,具体功能都没有实现,只有聊天功能实现了,是对我这些天学习的一个小总结吧

附工程文件

链接:http://pan.baidu.com/s/1qYVwOW0 密码:51kf


这篇关于Android入门攻略(另附一个简单的带socket的模仿QQ实例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/759821

相关文章

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也