Oldalak

2012. december 15., szombat

Élő háttérkép (live wallpaper demo) létrehozása

Élő háttérkép alkalmazás létrehozásának lépései:



    
    
    
        
         
            
                
            
            
        
        
    



Az alkalmazás manifest állományában az élő háttérkép alkalmazáshoz meg kell adni az élő háttérkép jogosultságot android:permission="android.permission.BIND_WALLPAPER", illetve a market felé az élő háttérkép alkalmazást jelezni kell
 
node -ban. A service node-ban az android:name=".OwnWallpaper" rész tartalmazza annak az osztálynak a nevét, ami megvalósítja az élő háttérkép osztályt. Az élő háttérkép alkalmazáshoz létre kell hozni egy XML állományt is, aminek az alábbi módon kell kinéznie (erre a manifest állományban is hivatkozni kell android:resource="@xml/own"):

Az own.xml állományt a /res/xml/own.xml útvonalon kell létrehozni




















Az OwnWallpaper osztály pedig az alábbiak szerint kell megcsinálni:

package hu.globomax.wallpaperdemo;

import java.util.Date;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.service.wallpaper.WallpaperService;
import android.view.MotionEvent;
import android.view.SurfaceHolder;

public class OwnWallpaper extends WallpaperService {

 @Override
 public Engine onCreateEngine() {
  
  return new CubeEngine();
 }

 class CubeEngine extends Engine {
  private final Paint mPaint = new Paint();
  private float mTouchX = 0;
  private float mTouchY = 0;
  
  CubeEngine() {
   final Paint paint = mPaint;
   paint.setColor(0xffffffff);
   paint.setTextSize(25);
  }

  @Override
  public void onCreate(SurfaceHolder surfaceHolder) {
   super.onCreate(surfaceHolder);
   // Érintés eseményre kezelés jelzése
   setTouchEventsEnabled(true);
  }

  @Override
  public void onTouchEvent(MotionEvent event) {
   super.onTouchEvent(event);

   if (event.getAction() == MotionEvent.ACTION_UP) {
    mTouchX = -1;
    mTouchY = -1;
   } else {
    mTouchX = event.getX();
    mTouchY = event.getY();
   }
   drawFrame();
  }

  @SuppressWarnings("deprecation")
  void drawFrame() {
   final SurfaceHolder holder = getSurfaceHolder();
   Canvas c = null;
   try {
    c = holder.lockCanvas();
    if (c != null) {
     c.save();
     c.drawColor(0xff000000);
     c.drawText(new Date(System.currentTimeMillis())
       .toLocaleString(), mTouchX, mTouchY, mPaint);
     c.restore();
    }
   } finally {
    if (c != null)
     holder.unlockCanvasAndPost(c);
   }
  }
 }
}

Az így elkészült alkalmazás pedig az alábbiak szerint viselkedik:


Fontos eseménykezelő metódusok:
onCreateEngine()

  • WallpaperService.Engine létrehozása
A létrehozott Engine fontosabb eseménykezelő metódusai:
onVisibilityChanged():
  • ha háttérbe kerül az alkalmazás
onOffsetChanged()
  • a home screen-ek közötti váltáskor üt be
onTouchEvent():
  • érintéskor bekövetkező eseménykezelő
onCommand():
  • más alkalmazás által küldött üzenetek érkezésekor üt be

Saját téma használata az alkalmazásban

Saját téma készítése az android:Theme -ből származtatva
/res/values/styles.xml -t ki kell egészíteni az alábbiak szerint:

    
Egyedi színeket definiáló XML-t létre kell hozni, ami leírja a mygreen színt. A /res/values/ könyvtárban létre kell hozni egy újabb XML állományt tetszőleges néven. Ennek az XML-nek az alábbi leírást adhatjuk:



    #11ff11


Bár ezt a /res/values/styles.xml -ben is lehetne tárolni, de így lehet áttekinthetőbb a kód talán.

Következő lépésben az alkalmazásunk manifest állományában az activity -nek "meg kell mondani", hogy az általunk definiált témát használja a program.



    

    
        
            
                

                
            
        
    



A fenti XML-ben az activity node-ban az android:theme="@style/CustomTheme" attribútumban lehet megadni, hogy az activity komponens az általunk definiált témát használja.

Az alkalmazás pedig az alábbi módon fog megjelenni:

Saját stílus használata a UI elemeken

Az egyéni stílusok használatát a UI elemeken az alábbi módon tehetjük meg. Első lépésben a projekthez tartozó stílusokat leíró XML-t kell megnyitni.


















Stílus állomány: res/values/styles.xml

Az XML-be az alábbi kódrészletet kell beilleszteni:


Második lépésben a UI-t leíró XML-ben a felületen megjelenő elemekhez hozzá kell adni az egyedileg definiált stílust.
/res/layout/activity_layout.xml


A stílust a style attribútumban lehet megadni: style="@style/ExampleStyle"

A programban pedig az alábbi módon fog megjelenni a stílus:

Almenü kezelés megvalósítása XML erőforrásban

Az almenü kezelés XML erőforrásban történő megvalósítása a következő képen történik: A project explorer-ben az erőforrások közül az activity-hez tartozó menü leíró XML-t kell megnyitni.


















Az almenü XML megvalósítását az alábbi példa szemlélteti:


    
    
    
        
            
            
        
    


A menü kezelésre pedig az alábbi java kód szükséges (a menüpontok kiválasztásra csak egy egyszerű Toast üzenetet jelenít meg):
package hu.globomax.submenudemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
  case R.id.item1:
   Toast.makeText(this, "Első menüpont kiválasztva", Toast.LENGTH_LONG).show();
   break;
  case R.id.item2:
   Toast.makeText(this, "Második menüpont kiválasztva", Toast.LENGTH_LONG).show();
   break;
  case R.id.submenu:
   Toast.makeText(this, "Almenüpont kiválasztva", Toast.LENGTH_LONG).show();
   break;
  case R.id.submenu_item1:
   Toast.makeText(this, "Almenüpont 1 kiválasztva", Toast.LENGTH_LONG).show();
   break;
  case R.id.submenu_item2:
   Toast.makeText(this, "Almenüpont 2 kiválasztva", Toast.LENGTH_LONG).show();
   break;
  default:
   break;
  }
  return true;
 } 
}
Az így elkészített almenü a telefonon az alábbi módon fog megjelenni:

Alert dialógus ablak

Alert dialógus ablak készítéséhez az alábbi kódrészletet kell használni:
private void showAlertMessage(final String aMessage) {
 AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
 alertbox.setMessage(aMessage);
 alertbox.setNeutralButton("Ok", new DialogInterface.OnClickListener() {
  public void onClick(DialogInterface arg0, int arg1) {
   Toast.makeText(MainActivity.this, "Hello", Toast.LENGTH_LONG).show();
   }
 });
 alertbox.show();
}
A fenti metódust meghívva az Alert dialógus ablak az alábbi módon fog megjelenni a telefonon:

2012. december 1., szombat

Popup demo

Az alábbi példában Popup ablak létrehozása és használata látható:
A kész program az alábbi módon jelenik majd meg:

A fő Activity komponens UI felülete az alábbi legyen:



    
A res/layout könyvtárba létre kell hozni egy új XML állományt, ami a Popup ablak felületét fogja leírni. Ennek a forrása az alábbi legyen:


      
      
      

Ezután a fő Activity osztályban a gomb esemény kezelőjében meg kell valósítani a PopUp ablak megjelenítését. Ennek a kódja az alábbi lesz:

package hu.myexamples.popupdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.PopupWindow;

public class MainActivity extends Activity {

 private Button btnPopup;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  btnPopup = (Button) findViewById(R.id.btnPopup);
 }

 public void onClick(View v){
  if (v.getId() == R.id.btnPopup) {
   LayoutInflater layoutInflater = (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
   View popupView = layoutInflater.inflate(R.layout.popup, null);
   final PopupWindow popupWindow = new PopupWindow(popupView,
     LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

   Button btnDismiss = (Button) popupView.findViewById(R.id.btnPopUpOk);
   btnDismiss.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
     popupWindow.dismiss();
    }
   });

   popupWindow.showAsDropDown(btnPopup, 50, -30);
  }
 }
}

MultiActivity demo

Ez a leírás azt a példát mutatja be, hogyan kell több Activity komponenst létrehozni illetve azokat elindítani illetve a log üzenetekből látható, hogy az egyes Activity komponensek "életciklus" eseményei hogyan keletkeznek.

Első Activity XML forrása:


    

A második és harmadik Activity UI felületét leíró XML-t az alábbi módon lehet létrehozni:
A Project Explorer-ben a res->layout könyvtáron kell egy jobb egér gombot nyomni, erre az alábbi menü jelenik meg. Itt a File menüt kell kiválasztani.

A menü kiválasztása után az alábbi dialódus ablak jelenik meg:

Ezt a műveletet annyiszor kell megismételni, ahány Activity komponenst szeretnénk létrehozni.

Második Activity XML forrása:


    

Harmadik Activity XML forrása:


    


A következő lépésben létre kell hozni az Activity layout-okhoz a kezelő osztályokat:
Ezt a Project Explorer-ben az src-> package könyvtáron kell egy jobb egér gombot nyomni, és itt a New Class menüt kell választani az alábbiak szerint:

A menüpont kiválasztása után az alábbi párbeszéd ablak jelenik meg:

A Name textbox-ba kell megadni az új osztály nevét. A befejezés után egy üres osztály deklarációt kapunk, aminek a kódját kiegészíthetjük úgy mint ahogy a MainActiviy osztályt létrehozta az Eclipse.

A MainActivity osztály definíciója:

package hu.globomax.multiactivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  Log.d("TEST", "MainActivity onCreate");
 }

 public void onClick(View v) {
  if (v.getId() == R.id.btnStartSecond) {
   Intent i = new Intent();
   i.setClass(this, SecondActivity.class);
   startActivity(i);
  }
 }

 @Override
 protected void onDestroy() {
  Log.d("TEST", "MainActivity onDestroy");
  super.onDestroy();
 }

 @Override
 protected void onPause() {
  Log.d("TEST", "MainActivity onPause");
  super.onPause();
 }

 @Override
 protected void onRestart() {
  Log.d("TEST", "MainActivity onRestart");
  super.onRestart();
 }

 @Override
 protected void onStart() {
  Log.d("TEST", "MainActivity onStart");
  super.onStart();
 }

 @Override
 protected void onStop() {
  Log.d("TEST", "MainActivity onStop");
  super.onStop();
 }

 @Override
 protected void onResume() {
  Log.d("TEST", "MainActivity onResume");
  super.onResume();
 }
}

A Második Activity osztály definíciója:

package hu.globomax.multiactivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.app.Activity;
import android.content.Intent;

public class SecondActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.sec);
  Log.d("TEST", "SecondActivity onCreate");
 }

 public void onClick(View v) {
  if (v.getId() == R.id.btnBackToFirst) {
   finish();
  } else if (v.getId() == R.id.btnStartThird) {
   Intent i = new Intent();
   i.setClass(this, ThirdActivity.class);
   startActivity(i);
  }
 }
 
 @Override
 protected void onDestroy() {
  Log.d("TEST", "SecondActivity onDestroy");
  super.onDestroy();
 }

 @Override
 protected void onPause() {
  Log.d("TEST", "SecondActivity onPause");
  super.onPause();
 }

 @Override
 protected void onRestart() {
  Log.d("TEST", "SecondActivity onRestart");
  super.onRestart();
 }

 @Override
 protected void onStart() {
  Log.d("TEST", "SecondActivity onStart");
  super.onStart();
 }

 @Override
 protected void onStop() {
  Log.d("TEST", "SecondActivity onStop");
  super.onStop();
 }
 
 @Override
 protected void onResume() {
  Log.d("TEST", "SecondActivity onResume");
  super.onResume();
 }
}

A Harmadik Activity osztály definíciója:

package hu.globomax.multiactivity;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class ThirdActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.third);
  Log.d("TEST", "ThirdActivity onCreate");
 }
 
 public void onClick(View v) {
  if (v.getId() == R.id.btnBackToSecound) {
   finish();
  }
 }
 
 @Override
 protected void onDestroy() {
  Log.d("TEST", "ThirdActivity onDestroy");
  super.onDestroy();
 }

 @Override
 protected void onPause() {
  Log.d("TEST", "ThirdActivity onPause");
  super.onPause();
 }

 @Override
 protected void onRestart() {
  Log.d("TEST", "ThirdActivity onRestart");
  super.onRestart();
 }

 @Override
 protected void onStart() {
  Log.d("TEST", "ThirdActivity onStart");
  super.onStart();
 }

 @Override
 protected void onStop() {
  Log.d("TEST", "ThirdActivity onStop");
  super.onStop();
 }
 
 @Override
 protected void onResume() {
  Log.d("TEST", "ThirdActivity onResume");
  super.onResume();
 }
}

Ezek után a projekt manifest állományában a második és harmadik Activity komponenseket is deklarálni kell.