ubuntu12.04 64 bit android studio
关于ubuntu下 studio 跑不起来实体机
a、 lsusb查看设备
b、在/etc/udev/rules.d/目录下添加 50-android.rules文件
c、在当前用户根目录下.android/adb_usb.ini 或者adb_usb.ini~文件,
1、android模拟器跑不起来报
提示/root/.android下,而实际是在/user/.android下面找的,
用链接ln -s /root/.android /usr/.android即可,将其链接过去
2、报[2014-07-16 17:24:02 - andr] Launching a new emulator with Virtual Device '2'
[2014-07-16 17:24:43 - Emulator] WARNING: Data partition already in use. Changes will not persist!
[2014-07-16 17:24:44 - Emulator] WARNING: SD Card image already in use: /root/.android/avd/2.avd/sdcard.img
[2014-07-16 17:24:45 - Emulator] WARNING: Cache partition already in use. Changes will not persist!
[2014-07-16 17:24:45 - Emulator] X Error of failed request: BadRequest (invalid request code or no such operation)
[2014-07-16 17:24:45 - Emulator] Major opcode of failed request: 136 (GLX)
[2014-07-16 17:24:45 - Emulator] Minor opcode of failed request: 19 (X_GLXQueryServerString)
[2014-07-16 17:24:45 - Emulator] Serial number of failed request: 12
[2014-07-16 17:24:45 - Emulator] Current serial number in output stream: 12
原因是64位系统
在命令行使用./emulator64-arm -avd 设备可以运行起来
4、一启动程序activity就显示输入法,让其隐藏的方法是,之需要在AndroidManifest.XML的activity里添加这一句
<activity
android:name="com.example.pratice.MainActivity"
android:windowSoftInputMode="stateHidden|adjustResize"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
5、关于absolutelayout用法
<AbsoluteLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="40dp"
android:orientation="horizontal"
android:id="@+id/viewGroup2"
android:layout_x="100px"
android:layout_y="100px">
</LinearLayout>
</AbsoluteLayout>
里面的布局可以写绝对位置,都是相对于屏幕的左上角位置
6、关于滑动页面的编写
(关于多页,没页有监听事件的时候,只有在页改变里做个页标记位,放在finishupdate()里更新每页的监听才不会出现异常,异常出现在到最后一页然后返回前一页时,否则无论是放在instantiateItem()还是页改变里面都会出现异常)
a、首先在主的布局文件中添加
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="fill_parent"
android:layout_height="450dp"
android:layout_marginTop="50dp"/>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="450dp"
android:orientation="vertical"
>
<AbsoluteLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="40dp"
android:orientation="horizontal"
android:id="@+id/viewGroup"
android:layout_x="370px" android:layout_y="310px">
</LinearLayout>
</AbsoluteLayout>
</RelativeLayout>
b、新建4个item1.xml item2.xml item3.xml item4.xml用于滑动页面的显示
c、java编写代码如下
package com.example.pratice;
import java.util.ArrayList;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
public class MainActivity extends Activity
{
private ViewPager viewPager;
private ArrayList<View> list;
private ViewGroup main,group;
private TextView textView;
private TextView[] textViews;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
LayoutInflater inflater=getLayoutInflater();
list=new ArrayList<View>();
list.add(inflater.inflate(R.layout.item1, null));
list.add(inflater.inflate(R.layout.item2, null));
list.add(inflater.inflate(R.layout.item3, null));
list.add(inflater.inflate(R.layout.item4, null));
textViews=new TextView[list.size()];
ViewGroup main=(ViewGroup) inflater.inflate(R.layout.fragment_main, null);
// groupÊÇR.layou.mainÖекÔð°ü¹üСԲµãµÄLinearLayout.
ViewGroup group=(ViewGroup) main.findViewById(R.id.viewGroup);
viewPager=(ViewPager)main.findViewById(R.id.viewPager);
for (int i = 0; i < list.size(); i++)
{
textView=new TextView(MainActivity.this);
textView.setLayoutParams(new LayoutParams(10,10));
textView.setPadding(0, 0, 2, 0);
textViews[i]=textView;
if (i==0)
{
// ĬÈÏœøÈë³ÌÐòºóµÚÒ»ÕÅ͌Ƭ±»Ñ¡ÖÐ;
textViews[i].setBackgroundResource(R.drawable.radio_sel);
}else {
textViews[i].setBackgroundResource(R.drawable.radio);
}
group.addView(textViews[i]);
}
requestWindowFeature(Window.FEATURE_NO_TITLE); //设置无标题
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//去掉信息栏
setContentView(main); //曾经因为这一个导致怎么弄都不显示
// setContentView(R.layout.fragment_main);
viewPager.setAdapter(new MyAdapter());
viewPager.setOnPageChangeListener(new MyListener());
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//水平显示
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//垂直显示
}
class MyAdapter extends PagerAdapter{
@Override
public int getCount()
{
return list.size();
}
@Override
public boolean isViewFromObject(
View arg0, Object arg1)
{
return arg0==arg1;
}
/* (non-Javadoc)
* @see android.support.v4.view.PagerAdapter#destroyItem(android.view.ViewGroup, int, java.lang.Object)
*/
@Override
public void destroyItem(
ViewGroup container,
int position, Object object)
{
((ViewPager)container).removeView(list.get(position));
}
/* (non-Javadoc)
* @see android.support.v4.view.PagerAdapter#finishUpdate(android.view.ViewGroup)
*/
@Override
public void finishUpdate(
ViewGroup container)
{
// TODO Auto-generated method stub
super.finishUpdate(container);
}
/* (non-Javadoc)
* @see android.support.v4.view.PagerAdapter#getItemPosition(java.lang.Object)
*/
@Override
public int getItemPosition(Object object)
{
// TODO Auto-generated method stub
return super.getItemPosition(object);
}
/* (non-Javadoc)
* @see android.support.v4.view.PagerAdapter#getPageTitle(int)
*/
@Override
public CharSequence getPageTitle(
int position)
{
// TODO Auto-generated method stub
return super.getPageTitle(position);
}
/* (non-Javadoc)
* @see android.support.v4.view.PagerAdapter#instantiateItem(android.view.ViewGroup, int)
*/
@Override
public Object instantiateItem( //viewpage里的控件必须在这里初始化,否则会程序会蹦掉
ViewGroup container, int position)
{
((ViewPager)container).addView(list.get(position));
return list.get(position);
}
}
class MyListener implements OnPageChangeListener{
@Override
public void onPageScrollStateChanged(
int arg0)
{
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0,
float arg1, int arg2)
{
// TODO Auto-generated method stub
}
@Override
public void onPageSelected(int arg0)
{
for(int i=0;i<textViews.length;i++) {
textViews[arg0].setBackgroundResource(R.drawable.radio_sel);
if (arg0!=i)
{
textViews[i].setBackgroundResource(R.drawable.radio);
}
}
}
}
}
7、图片的实现
<ImageView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:scaleType="fitCenter"
android:src="@drawable/b2"
></ImageView>
这里的b2之需要就爱那个图片拷贝到res/drawable文件夹下即可,就可以显示图片了
8、tablelayout使用
<TableLayout
android:id="@+id/dictTable"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="0dp">
<TableRow >
<Button
android:layout_width="152dp"
android:layout_height="120dp"
android:text="xxx"
android:drawableLeft="@color/red"
android:layout_marginLeft="60dp"
android:layout_marginTop="20dp">
</Button>
<Button
android:layout_width="152dp"
android:layout_height="120dp"
android:text="xxx"
android:drawableLeft="@color/red"
android:layout_marginLeft="45dp"
android:layout_marginTop="20dp">
</Button>
<Button
android:layout_width="152dp"
android:layout_height="120dp"
android:text="xxx"
android:drawableLeft="@color/red"
android:layout_marginLeft="45dp"
android:layout_marginTop="20dp">
</Button>
</TableRow>
<TableRow >
<Button
android:layout_width="152dp"
android:layout_height="32dp"
android:text="xxx"
android:layout_gravity=""
android:drawableLeft="@color/red"
android:paddingTop="0px"
android:layout_marginLeft="60dp">
</Button>
<Button
android:layout_width="152dp"
android:layout_height="32dp"
android:text="xxx"
android:paddingTop="0px"
android:drawableLeft="@color/red"
android:layout_marginLeft="45dp">
</Button>
<Button
android:layout_width="152dp"
android:layout_height="32dp"
android:text="xxx"
android:paddingTop="0px"
android:drawableLeft="@color/red"
android:layout_marginLeft="45dp">
</Button>
</TableRow>
</TableLayout>
9、button事件的响应
a、首先在主的xml里面定义button
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/save"
android:drawableLeft="@color/red">
</Button>
b、java代码中添加
public class MainActivity extends Activity
{
public Button btn1=null;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//............................此处省略************************
btn1.setOnClickListener(listener);
} private OnClickListener listener =new OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
Button btn=(Button)v;
switch (btn.getId())
{
case R.id.button1:
Toast.makeText(MainActivity.this, "按钮1被单击", Toast.LENGTH_LONG).show();
break;
default:
break;
}
}
};
}
10、手势的识别
import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class SecondActivity extends Activity implements OnTouchListener, OnGestureListener{
private GestureDetector mGestureDetector = new GestureDetector(this); //在后面的onTouceEvent事件中调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.fragment_second);
TextView tv = (TextView) findViewById(R.id.textView1);
tv.setOnTouchListener(this); //touch使能
// tv.setLongClickable(true); //长按使能
// mGestureDetector.setIsLongpressEnabled(true);
tv.setClickable(true);
}
@Override
public boolean onDown(MotionEvent arg0) {
// TODO Auto-generated method stub
// TextView tv = (TextView) findViewById(R.id.textView1);
// tv.setText("1");
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, //滑动之后抬起来进入这个函数,第一个参数是起点,第二个参数是终点,第三个参数是x轴的加速度,第四个参数是Y轴的加速度
float velocityY) {
// TODO Auto-generated method stub
int FLING_MIN_DISTANCE = 100;
int FLING_MIN_VELOCITY = 200;
if (Math.abs((e1.getX() - e2.getX())) > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
Toast.makeText(getApplicationContext(), "hjj", Toast.LENGTH_SHORT).show();
}
return false;
}
@Override
public void onLongPress(MotionEvent arg0) {
// TODO Auto-generated method stub
// TextView tv = (TextView) findViewById(R.id.textView1);
// tv.setText("1");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float arg2, float arg3) {//滑动的时候进入,参数同上
// TODO Auto-generated method stub
return false;
}
@Override
public void onShowPress(MotionEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public boolean onSingleTapUp(MotionEvent arg0) {
// TODO Auto-generated method stub
// TextView tv = (TextView) findViewById(R.id.textView1);
// tv.setText("1");
return false;
}
public boolean onTouchEvent(MotionEvent event) {
return false;
}
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {//触动屏幕的时候首先进入这个函数,然后调用里面的函数,这里以后有时间要研究一下机会,没一次来的时候都要调用一下
// TODO Auto-generated method stub
return mGestureDetector.onTouchEvent(arg1); //我们之前定义的,在这里调用
// return false;
}
}
11、关于从一个activity推出更新另外一个activity中的数据,其中另外一个activity中有viewpage控件
方法:重载onResume()
在onResume()中添加标记位,表明已经初始化viewpage,否则程序会蹦掉
public void onResume()
{
if(a == 1)//此处在viewpage的instantiateItem中标记为1了
{
MyApp appState = ((MyApp)getApplicationContext());
int state = appState.getState();
Button t0 = (Button)findViewById(R.id.t0);
String i = Integer.toString(state);
t0.setText(i);
}
super.onResume();
}
public Object instantiateItem(ViewGroup container, int position)
{
a = 1;
}
12、定时器的使用
a、采用Handler的postDelayed(Runnable, long) 方法
这个实现比较简单一些:
1. Handler handler=new Handler();
Runnable runnable=new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
//要做的事情
handler.postDelayed(this, 2000);
}
};
2.启动计时器:
handler.postDelayed(runnable, 2000);//每两秒执行一次runnable.
3.停止计时器:
handler.removeCallbacks(runnable); //如果不移除,在本activity退出时,此定时器仍然存在,且在不断的进入
b、采用Handle与线程的sleep(long )方法
Handler主要用来处理接受到的消息。这只是最主要的方法,当然Handler里还有其他的方法供实现,有兴趣的可以去查API,这里不过多解释。
1.定义一个Handler类,用于处理接受到的Message.
Handler handler = new Handler() {
public void handleMessage(Message msg) {
//要做的事情
super.handleMessage(msg);
}
};
2.新建一个实现Runnable接口的线程类。如下:
public class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(10000);//线程暂停10秒,单位毫秒
Message message=new Message();
message.what=1;
handler.sendMessage(message);//发送消息
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3.在需要启动线程的地方加入下面语句:
new Thread(new MyThread()).start();
此方法也是在本avtivity退出的时候此线程仍然存在
13、禁止输入发全屏
一是在源码里进行修改。
frameworks/base/core/java/android/inputmethodservice/InputMethodService.java
1、 在updateFullscreenMode(..)中,将boolean isFullscreen = mShowInputRequested && onEvaluateFullscreenMode();
改为boolean isFullscreen=false;
2、也可以:直接修改onEvaluateFullscreenMode()的返回值为false <自定义输入法时,可以直接重写之,就不必在源码中修改了>
二是在自己EditText的xml里加上属性
android:imeOptions="flagNoExtractUi"
14、不同屏幕匹配
a、获取屏幕大小
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
int screenWidth = screenWidth = display.getWidth();
int screenHeight = screenHeight = display.getHeight();
// 方法2
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int widthPixels = dm.widthPixels;
int heightPixels = dm.heightPixels;
int dpi = dm.densityDpi;
float width=dm.widthPixels*dm.density;
float height=dm.heightPixels*dm.density;
float xdpi = dm.xdpi;
float ydpi = dm.ydpi;