在使用Android 4.4新增特性\"View.SYSTEM_UI_FLAG_IMMERSIVE\"时,Eclipse报错:SYSTEM_UI_FLAG_IMMERSIVE cannot be resolved or is not a field,下面一起来看解决办法
解决方法:
首先需要保证SDK的API level >= 19,否则你需要通过Android SDK Manager下载大于等于19的开发版本。
版本没问题的话,然后打开菜单 => "Project" => "properties" => "Android" => "Project Build Target" => 勾选19以上的API。
学完了Java(虽说没怎么练手),开始学Android编程。首先还是做个计算器(感觉这辈子只能做计算器了 话说Android的布局真是太方便了,下面是布局文件
例子
代码如下 |
复制代码 |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/warpcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<HorizontalScrollView
android:id="@+id/scrollview"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/resultText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:gravity="right"
android:padding="8dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:text="@string/number0"
android:textSize="40sp" />
</HorizontalScrollView >
<TableLayout
android:id="@+id/buttonTable"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:stretchColumns="*" >
<TableRow
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<Button
android:id="@+id/button7"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/number7" />
<Button
android:id="@+id/button8"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/number8" />
<Button
android:id="@+id/button9"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/number9" />
<Button
android:id="@+id/buttonBackSpace"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/backspace" />
<Button
android:id="@+id/buttonClear"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/clear" />
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/number4" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/number5" />
<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/number6" />
<Button
android:id="@+id/buttonMultiply"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/multiply" />
<Button
android:id="@+id/buttonDivide"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/divide" />
</TableRow>
</TableLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<TableLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="3"
android:stretchColumns="*" >
<TableRow
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/number1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/number2" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/number3" />
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<Button
android:id="@+id/button0"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/number0" />
<Button
android:id="@+id/buttonDot"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/dot" />
<Button
android:id="@+id/buttonNegSign"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:onClick="onClickListener"
android:text="@string/negSign" />
</TableRow>
</TableLayout>
<Button
android:id="@+id/buttonPlus"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:onClick="onClickListener"
android:text="@string/plus" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:orientation="vertical" >
<Button
android:id="@+id/buttonMinus"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:onClick="onClickListener"
android:text="@string/minus" />
<Button
android:id="@+id/buttonEval"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:onClick="onClickListener"
android:text="@string/eval" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
|
MainActivity类和之前的java计算器差不多:
代码如下 |
复制代码 |
package me.jerrys.calc;
import java.math.BigDecimal;
import android.support.v7.app.ActionBarActivity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
private TextView textView;
private BigDecimal lastNum = new BigDecimal("0");
private BigDecimal currentNum = new BigDecimal("0");
private String currentText;
private boolean typeClean = false;
private boolean hadCalced = false;
private MODE currentMode = MODE.PLUS;
private enum MODE {
PLUS, MINUS, MULTIPLY, DIVIDE
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.resultText);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void onClickListener(View v) {
currentText = textView.getText().toString();
switch (v.getId()) {
case R.id.button0:
addNumber("0");
break;
case R.id.button1:
addNumber("1");
break;
case R.id.button2:
addNumber("2");
break;
case R.id.button3:
addNumber("3");
break;
case R.id.button4:
addNumber("4");
break;
case R.id.button5:
addNumber("5");
break;
case R.id.button6:
addNumber("6");
break;
case R.id.button7:
addNumber("7");
break;
case R.id.button8:
addNumber("8");
break;
case R.id.button9:
addNumber("9");
break;
case R.id.buttonNegSign:
addSign();
break;
case R.id.buttonClear:
clear();
break;
case R.id.buttonBackSpace:
backSpace();
break;
case R.id.buttonPlus:
setMode(MODE.PLUS);
break;
case R.id.buttonMinus:
setMode(MODE.MINUS);
break;
case R.id.buttonMultiply:
setMode(MODE.MULTIPLY);
break;
case R.id.buttonDivide:
setMode(MODE.DIVIDE);
break;
case R.id.buttonEval:
calc();
break;
case R.id.buttonDot:
addNumber(".");
break;
}
}
private void calc() {
if (hadCalced && typeClean) return;
currentNum = new BigDecimal(currentText);
try {
switch (currentMode) {
case PLUS:
lastNum = lastNum.add(currentNum);
break;
case MINUS:
lastNum = lastNum.subtract(currentNum);
break;
case MULTIPLY:
lastNum = lastNum.multiply(currentNum);
break;
case DIVIDE:
lastNum = lastNum.divide(currentNum, 16,
BigDecimal.ROUND_HALF_DOWN);
break;
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "发生错误:"+e.getMessage(), Toast.LENGTH_SHORT).show();
return;
}
String resultText = lastNum.toString();
if (resultText.indexOf(".") > 0) { // 消除小数多余位数
resultText = resultText.replaceAll("0+?$", "");
resultText = resultText.replaceAll("[.]$", "");
}
setResultText(resultText);
typeClean = true;
hadCalced = false;
}
private void setMode(MODE mode) {
if (!hadCalced && !typeClean) {
calc();
currentMode = mode;
return;
}
lastNum = new BigDecimal(currentText);
currentMode = mode;
typeClean = true;
hadCalced = true;
}
private void addSign() {
if (currentText.equals("0") || currentText.equals("")) return;
if (currentText.startsWith("-")) setResultText(currentText.substring(1));
else setResultText("-" + currentText);
}
private void clear() {
currentNum = new BigDecimal("0");
lastNum = new BigDecimal("0");
typeClean = false;
currentMode = MODE.PLUS;
setResultText("0");
}
private void setResultText(String string) {
textView.setText(string);
}
public void addNumber(String num) {
String resultText = currentText;
if (typeClean == true) {
resultText = "0";
typeClean = false;
}
if (num.equals(".") && currentText.lastIndexOf(".") != -1) return;
if ((resultText.equals("0") || resultText.equals(""))
&& !num.equals("."))
resultText = "";
resultText = resultText + num;
setResultText(resultText);
}
private void backSpace() {
if (currentText.equals("0") || currentText.equals("")) return;
if (currentText.length() == 1) {
setResultText("0");
return;
}
setResultText(currentText.substring(0, currentText.length() - 1));
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_about) {
new AlertDialog.Builder(this).setTitle("关于").setMessage("【Android www.111cn.net简易计算器】n作者 JerryLocken博客 n源码 /android-simple-calc").setPositiveButton("确定", null).show();
return true;
}
return super.onOptionsItemSelected(item);
}
}
|
下面给大家分享一篇关于利用ListView实现圆弧列表的方法,希望此教程对各位安卓开发者会带来帮助哦。
简介
制作一个垂直列表非常常见也很简单,如下所示:
但是我们如何创建一个可以圆弧型的列表呢?就像下面的效果:
如何实现?
当然,我们必须定制一个视图来创建一个那样的列表。我决定使用SurfaceView 来创建这个列表视图。经过分析之后,该问题包含如下内容:
-
如何在圆弧内绘制图片?
-
如何让列表按照圆弧的轨迹滑动?
如何在圆弧内绘制图片?
假设有一个带中心点的圆弧(centerX, centerY)和半径r。一个点P有相对于中心点的角度。那么下面的公式就可以描述出该问题:
基于此,我们可以很方便的在圆弧上绘制一个列表项.
如何在圆弧上滑动列表视图?
当用户滑动列表时,会出现该问题。我们如何更新每个列表项的角度?确切的说,我们必须详细记录滑动的角度。之后添加到当前列表视图中每一项的角度中。为了解决这个要求。我决定使用GestureDetector 来控制这个事件。同时,在这个类中,我主要考虑的是如何详细记录滑动的角度(函数名如下).
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
基于e2, distanceX, 和 distanceY,滑动的角度将被详细记录到下面的图片中:
基于此图片,我们给出了下面的公式
=> scroll angle = β - α
代码
我讲创建一个展示的列表作为样例。列表中的图片来自于资源文件夹。你可以参考我上传的源代码.
代码如下 |
复制代码 |
int[] playerDrawableResourceIds = new int[] { R.drawable.ronaldo,
R.drawable.zindance, R.drawable.congvinh, R.drawable.huynhduc,
R.drawable.gerrard, R.drawable.nagatomo, R.drawable.messi,
R.drawable.minhphuong, R.drawable.neymar, R.drawable.ronaldo_beo,
R.drawable.ronaldinho, R.drawable.xavi };
|
如何在圆弧中绘制图片?
首先,创建一个列表项的类CircleDrawItem.
代码如下 |
复制代码 |
public class CircleDrawItem {
public Bitmap mIconBitmap;
public double mAngle;
} |
mIconBitmap: 列表项的位图.
mAngle: 每个列表项的弧度。这个弧度在旋转列表项的时候会被更新.
因为该圆弧将被在屏幕左侧展示。所以圆心将会把X坐标设置为负数。同时,Y坐标将被设置为屏幕中心的Y坐标值.
代码如下 |
复制代码 |
mCenterX = (int) (-Global.dp * 200);
mCenterY = (int) (Global.dh / 2.0f);
mRadius = (int) (450 * Global.dp);
mStartAngleInRadian = Math.PI / 4; |
用Global 的值进行计算:
代码如下 |
复制代码 |
Global.dw = getResources().getDisplayMetrics().widthPixels;
Global.dh = getResources().getDisplayMetrics().heightPixels;
Global.dp = Global.density / 1.5f; |
这个圆弧保有CircleDrawItem的数组列表。第一项的弧度为PI/4。每个列表项的间隔是PI/10.第一项的弧度和两项间的弧度可以根据你的需求进行修改。
代码如下 |
复制代码 |
for (int i = 0; i < playerDrawableResourceIds.length; i++) {
CircleDrawItem circleDrawItem = new CircleDrawItem();
circleDrawItem.mIconBitmap = decodeSampledBitmapFromResource(
getResources(), playerDrawableResourceIds[i], 50, 50);
circleDrawItem.mAngle = mStartAngleInRadian - i * Math.PI / 10;
datas.add(circleDrawItem);
} |
我创建了一个线程,以便将每个数据项绘制到圆弧中。
代码如下 |
复制代码 |
protected void draw() {
Canvas canvas = getHolder().lockCanvas();
if (canvas == null) {
return;
}
canvas.save();
canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setAntiAlias(true);
for (int i = 0; i < datas.size(); i++) {
canvas.save();
CircleDrawItem item = datas.get(i);
double x = mCenterX + Math.cos(item.mAngle) * mRadius;
double y = mCenterY - Math.sin(item.mAngle) * mRadius;
canvas.drawBitmap(item.mIconBitmap,
(int) x - item.mIconBitmap.getWidth() / 2, (int) y
- item.mIconBitmap.getHeight() / 2, paint);
canvas.restore();
}
canvas.restore();
getHolder().unlockCanvasAndPost(canvas);
}
|
如何让列表在圆弧中滑动?
引用OnGestureListener 并重载onScroll()函数。
代码如下 |
复制代码 |
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
float tpx = e2.getX();
float tpy = e2.getY();
float disx = (int) distanceX;
float disy = (int) distanceY;
double scrollAngle = calculateScrollAngle(tpx, tpy, tpx + disx, tpy
+ disy);
for (int i = 0; i < datas.size(); i++) {
datas.get(i).mAngle += scrollAngle;
}
return true;
}
|
计算滑动角度的方法如下:
代码如下 |
复制代码 |
private double calculateScrollAngle(float px1, float py1, float px2,
float py2) {
double radian1 = Math.atan2(py1, px1);
double radian2 = Math.atan2(py2, px2);
double diff = radian2 - radian1;
return diff;
}
|
最近在学习android应用开发了,但看到一段代码中有一句Handler.removeCallbacksAndMessages(null)当时搞不明白为什么时候会是移除空了,后来参考了一些资料才知识,下面一起来看看。
今天都到一段代码,在onDestroy()方法中,使用了下面的代码:
mHandler.removeCallbacksAndMessages(null);
一开始我完全看不懂,我为什么参数是null,如果是null还需要移除什么Callbacks和Messages。后来察看官方文档有以下说明:
地址:http://developer.android.com/reference/android/os/Handler.html#removeCallbacksAndMessages%28java.lang.Object%29
public final void removeCallbacksAndMessages(Object token)
Added in API level 1
Remove any pending posts of callbacks and sent messages whose obj istoken. If token is null, all callbacks and messages will be removed.
上面的意思是说,如果参数为null的话,会将所有的Callbacks和Messages全部清除掉。
这样做的好处是在Acticity退出的时候,可以避免内存泄露。
如果你想制作自己的Android天气应用,那么你来对地方了.没有比使用Google Weather API XML解析更简单的方法了.所以你只需要知道如何解析XML即可.
背景
我们需要简单的访问XML来解析XML文档.因此,你只要知道在XML文档代码里结果的位置地方,然后解析它就很简单.举个例子,在下面这张图里,我们想要知道有关突尼斯的斯法克斯的天气:
一开始,我们需要指定我们想要知道天气的城市或者州.
代码如下 |
复制代码 |
String c = city.getText().toString();
String s = state.getText().toString();
StringBuilder URL = new StringBuilder(BaseURL);
URL.append(c+","+s);
String fullUrl= URL.toString();
try
{
URL website= new URL(fullUrl);
//getting xmlReader to parse data
SAXParserFactory spf= SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader() ;
HandlingXmlStuff doingWork = new HandlingXmlStuff();
xr.setContentHandler(doingWork);
xr.parse(new InputSource(website.openStream()));
String information = doingWork.getInformation();
tv.setText(information);
}
catch(Exception e)
{
tv.setText("error");
}
|
然后, 我们开始解析XML文档.
代码如下 |
复制代码 |
public class HandlingXmlStuff extends DefaultHandler {
XMLDataCollected info = new XMLDataCollected();
public String getInformation()
{
return info.dataToString();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (localName.equals("city"))
{
String city=attributes.getValue("data");
info.setCity(city);
}else if (localName.equals("temp_f")){
String t = attributes.getValue("data");
int temp = Integer.parseInt(t);
info.setTemp(temp);
}
}
}
|
我们需要指定我们的数据模型和使用的功能.
代码如下 |
复制代码 |
public class XMLDataCollected {
int temp= 0;
String city=null ;
public void setCity(String c)
{
city= c ;
}
public void setTemp(int t )
{
temp = t ;
}
public String dataToString()
{
return "In"+city+" the current Temp in F is "+ temp+" degrees";
}
} 。 |
兴趣点
在这个方案里, 你学会了在Android应用里如何使用XML解析来轻松制作许多功能