android
SEARCH
- GRIDE LAYOUT (FILE J)
اکتیوی ها از کلاس AppCompatActivity ارث میبرند
TextView tv ;
Button bt;
متغیر های tv و bt از نوه تکست و دکمه هستند،
setContentView
نحتوای layout رو نشون میده که در فایل های xml هستند
نحوه دسترسی به ریسورس ها
در جا وا از سریق کلاس R
و در xml از طریق @ و میتونیم به ریسوسرس دسترسی پیدا کنیم
setContentView(R.layout.activity_main);
... findViewById( R.id.textView );
//...............
@string/textText
//...............
@drawble/icon123 //<- file icon123.png tuye res/drawble hast
در مورد اول در کد جاوا میگیم که از layout اکتوتی اصلی رو میخواییم
و در مورد دوم میگیم برو به فایل strings و امتن اونی که اسمش textText هست رو بیار واسمون
id
برای ست کردن id به المنت از این طریق عمیل میکنیم
و بعدا برای اضافه کردن خاصیت جدید به این المنت از طریق همین id باید اقدام کنیم
android:id="@+id/button"
findViewById
وقتی میخواییم به خصوصیات به شی دسترسی داشته باشیم با ایتن تابع و از طریق ایدی که در مرحله قبل ست کردیم میتوانیم یک instance از شی را برگدانیم
package com.example.ali.myapplication2;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.w3c.dom.Text;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
TextView tv ;
Button bt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt = findViewById( R.id.button );
bt.setOnClickListener( this );
tv = findViewById( R.id.textView );
}
@Override
public void onClick(View view) {
tv.setText("dsdsdsd");
}
}
Intetnt
برای رفتن از یک اکتیویتی به یک اکتیویتی دیگر با ید از intetnt استفاده کنیم
اول یک کلاس نمونه به همراه پاس دادن یک ابجکت از اون رو میسازیم؛
و سپس استارت میکنیم
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent);
برای فرستادم مقادیر از یک اکتیویتی به یک اکتیویتی دیگر باید مقادر را putExtra کنیم
و برای دیفات در یک اکتیویتی باید آنرا get کنیم
همچنین برای چک کردن اینکه کلید همراه intent ارسال شده و وجود داره یا نه:
Bundle extras = getIntent().getExtras()
if( extras.containsKey("test") )
{
extras.getString("phone");
}
iintent call activity with code
برای فراخوانی یک اکتیویتی بطوری که قابل شناسایی باشد، یعنی برای یک کاری صدا کنیم و منتظر جواب بمانیم، باید یک کد به اکتیویتی ارسال کنیم
-- //startActivity(intetnt);
++ startActivityForResult(intetnt,SUCCES_CODE);
ودر اکتیویتی ای که فراخوانی میشود باید توسط setResult یک مقادر return کنیم و سپس اکتیوی را finish کنیم
setResult(50);
finish();
و جوابی که اکتیویتی فراخوانی شده بر میگردانه در تابع onActivityResult جاری قابل دریافت است این تابع
همچنین میتوانیم دیتا و سایر اجزا را به اکتیویتی ای که اکتویتی جاری را فراخوانی کرده است برگردانیم
Intent intent = new Intent();
intent.putExtra("DATA","SALAM1");
setResult(50,intent);
finish();
lifeCircle
چرخه اکتیوتی ها یک چرخه زندگی هست که نحوه اجرا شدن اکتیویتی و متد ها را به ترتیب نشون میده
menu (file E)
دو نوع منو داریم یکی آپشن و یکی هم متریال؟!
برای ایجاد آپشن روی res کلیک راست میکنیم و ادد ریسوزس میزنیم و منو رو انتخاب میکنیم
با اینکار یک افایل xml به ریسورس اضافه میشه که شامل منو هست و میتونیم منو و ساب منو و گروه اضافه کنیم
بعد از ایجاد منو ها، در فایل جاوا برای اینکه این فایل منو رو به اکتیویتی اتچ کنیم، باید در تابع زیر برنامه بنویسیم
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return super.onCreateOptionsMenu(menu);
}
این تابع در هنگتم لود اکتیویتی فراخوانی میشه که باید در اون بگیم منو میخواییم
برای اینکار از دستور زیر استفاده میکنیم :
getMenuInflater().inflate(R.menu.menu_main,menu);
که یه رفرنس به فایل ریسوسر منو و اسم منو میدیم که باعث میشه اون رو توی اکتیویتیمون لود کنه
هر وقت هرکد.م از آیتم ها لکلیک بشن تابع زیر به صدا در میاد
onOptionsItemSelected
توی این تابع باید آیدی هر Itam که اومده رو بگیریم، و به این متوجه میشیم روی کدوم Item کلیک شده
public boolean onOptionsItemSelected(MenuItem item) {
if( item.getItemId() == R.id.alakiToast ){
Toast.makeText(this, "alaki!", Toast.LENGTH_LONG).show();
}else
{
Toast.makeText(this, "vaghei!", Toast.LENGTH_LONG).show();
}
return super.onOptionsItemSelected(item);
}
برای ادد کردم منو به شکل برنام نویسی :
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add("item1");
SubMent item2 = menu.addSubmenu("item2");
item2.add("sub item2");
return super.onCreateOptionsMenu(menu);
}
editText
//global
EditText et ;
//main
et = findViewById(R.id.etTest);
et.setOnFocusChangeListener(this);
TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
tv.setText( charSequence );
}
@Override
public void afterTextChanged(Editable editable) {
}
};
et.addTextChangedListener(textWatcher);
@Override
public void onFocusChange(View view, boolean b) {
String s = "Hii";
if (view.getId() == R.id.etTest){
s = "Byyy";
}
if (b) s="sick";
Toast.makeText(this, s , Toast.LENGTH_SHORT).show();
}
دریافت متن و ست کردن متن
String s = et.getText().toString();
et.setText(TEXT);
xml (layout)
بعد ازاینکه لایه ها رو ساختیم برای اکتیویتی میتوانیم یک لایه را در یک لایه دیگه Include کنیم
برای اینکار در فیال xml از دستور include استفاده میکنیم
<include layout="@layout/NAME_FILE_XML"
android:id="@+id/id_layout"/>
handle activiti with class
برای اینکه بتوانیم متدهای اجزای سازنده اکتیویتی را تحت کنترل در بیاوریم، باید از geter ها استفاده کنیم
به وسیله آن میتوانیم رفتار اجزا را تعیین و یا overide کنیم
OPEN Intent (SMS,PHON) (FILE I)
Intent intent = new Intent( Intent.ACTION_VIEW );
intent.SetData( Uri.parse("sms:+1234456") );
startActivity(intent);
home
دکمه back در بالای اکتیویتی برای بازگشت به اکتیویتی قبلی و همچنین برنامه ننویسیبرا این دکمه
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
تابعی که بعد از کیلیک شدن به این دکمه فراخوانی مشود همان تابع onOptionsItemSelected هست که برای اسیر ایتم ها منو هم فراخوانی میشد
if(item.getItemId() == android.R.id.home)
{
finish();
}
animation
برای اینکه آلفای یک تصویررا به صفر برسانیم و اینکار طی یک مدت زمانی انجام شود
نکته اینکه عدد 0f به معنی 0 در مبنای float هست اگر 0.0 بزاریم double حساب میشود و خطا میدهد
iv.animate().alpha(0f).setDuration(2000);
حرکت افقی و عمودی ؛ در کد اول حرکت در y نسبی است و در کد دوم میره دقیقا به 50
iv.animate().translationYBy(50).setDuration(2000);
//------
iv.animate().translationY(50).setDuration(2000);
چرخش
iv.animate().rotation(90f).setDuration(2000);
iv.animate().rotationBy(90f).setDuration(2000);
تغییر عکس
ImageView iv = findbyid(...)
iv.SetImageResource(R.drawable.axname);
والد فرزند
LinearLayout L = findViewById(R.id.LID);
L.getChildCount(); // <-- tedad farzand
L.getChildAt( i ); // <-- farzand i'om
video view
نشان دادن ویدو بدون گزینه های کنترلی
VideView vv = findById(R.id.videview);
vv.setVideoPath( "android.resource://" + getPackageName() + R.raw.videofilename );
vv.start();
اضافه کردن دکمه های کنترلی
VideView vv = findById(R.id.videview);
vv.setVideoPath( "android.resource://" + getPackageName() + R.raw.videofilename );
MediaController c = new MediController(this);
c.setAmchorView(vv);
vv.SetMediaController( c );
vv.start();
audio
MediaPlayer mp = MediaPlayer.create( this, R.raw.audiofile );
mp.start();
mp.pause();
mp.isPlayeing();
mp.getDuration(); //<- modat zamane ahang
خواندن volume دستگاه
اول یک ابجکت ایجاد میکنیم و سپس بهش میگیم که بمیخواهیم وصل بشیم به volume سیستم
AudioManager audioManager;
audioManager = getSystemService(Context.AUDIO_SERVICE);
int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
int curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, NUMBER , 0); // <-set deviice volume
در کد پایین از طریق fromUser میتونیم متوجه بشیم اندروید در حال دستکاری در سیک بار هست و یا یوزر داره باهاش بازی میکنه
اگر مقدار true بود یعنی یوزر داره کار میکنه باهاش
seekBar
SeekBar sb = findById(...);
sb.setProgress(10);
sb.setMax(100);
sb.setOnSeekBarChangeListener(this);
sb.setOnSeekBarChangeListener( new SeekBar.OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// change volume
//progress <- adade seek bar
// audioManager da r bala tashrih shode
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
});
DIALOG
progress bar
میتوایم به کاربر دیالوگ ها رو نشان دهیم که کاربدهای مختلفی دارد
ProgressDialog pd = new ProgressDialog(this);
قابلیت کنسل کردن توسط کاربر را غیر فعال میکنیم،
pdialog.setCancelable(false);
ست کردن متن و عنوان
pdialog.setTitle("progress dialog example");
pdialog.setMessage("please wait ...");
ست کردن استایل
pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
نمایش دادن دیالوگ
pdialog.show();
بستن دیالوگ
pdialog.dismiss();
هنگامی که استایل بصورت افقی ست شده باشد، گزینه های زیر در دسترس هستند:
که میتوانیم نوار پیمایش را کنترل کنیم
pdialog.setProgress(0);
pdialog.getMax()
pdialog.incrementProgressBy(1)
نوار هیچ پیشرفتی نمیکند و حالت نا مشخص میگیرد
pdialog.setIndeterminate(true);
همچنین یک حالت دیگری هم داریم که بنام پروگرس بار دوم
که میشه یک progressbar زیر اونیکی؛ مثلا برای مواقعی که فیلم در حال دانلود هست و بافر در حال پر شدن هست …
pdialog.getSecondaryProgress();
pdialog.incrementSecondaryProgressBy(1);
Alert
برای نشان دادن یک هشدار
یک هشدار با دکمه های yes و no و cancel نشان میدهد که در صورتی که کاربر yes انتخاب کرد یک پیام نشان میدهد
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("AlertDialog")
.setMessage("MSG")
.setCancelable(false)
.setIcon(android.R.drawable.ic_dialog_info)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(DialogActivity.this, "File Deleted!", Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("No", null)
.setNeutralButton("Cancel", null);
چند گزینه ای که فقط میشه یک گزینه انتخاب کرد
builder.setTitle("Question ?")
.setCancelable(false)
.setSingleChoiceItems(new String[]{"A", "B", "C", "D"}, -1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(DialogActivity.this, "i = " + i, Toast.LENGTH_SHORT).show();
}
})
.setPositiveButton("OK", null);
چند گزینه ای که میشه چندین گزینه انتخاب کرد
builder.setTitle("")
.setCancelable(true)
.setMultiChoiceItems(new String[]{"item0", "item1", "item2", "item3", "item4", "item5"},
new boolean[]{false, true, false, true, true, false},
new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i, boolean b) {
Toast.makeText(DialogActivity.this, "item" + i + " : " + b, Toast.LENGTH_SHORT).show();
}
})
.setPositiveButton("Ok", null);
builder.show();
و دیالوگی که خودمون طراحی مکنیم و یک اکتیویتی دیگر را نشون میدیم
Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.play_ground);
dialog.show();
List view
برای ساخت لیست یه 3 چیز نیازمندیم
- لیست آیتم ها
- لیست ویو اندروید
- و اداپتر
اول باید لیست را بسیازیم و سپس یک لیست ویو به اکتیویتی اضافه کنیم
در نهایت به وسیله اداپتر به اندروید بگوییم این لیست را به چه شکلی نمایش بده
List<String> items;
items = new ArrayList<>();
items.add("Tehran");
items.add("Mashhad");
items.add("Isfahan");
items.add("Shiraz");
ListView listview;
listview = (ListView) findViewById(R.id.listview);
ArrayAdapter<String> adapter;
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
listview.setAdapter(adapter);
و همچنین میتوانیم برای کلیلک کردن روی هرکدام از آنها یک تابع تعریف کنیم…
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(SimpleListActivity.this, items.get(i), Toast.LENGTH_SHORT).show();
}
});
برای اضافه کردن و حذف گزینه ها که بدن شکل میباید که عنصر مورد نظر را از ایتم ها حذف میکنیم و سپس اداپتر را به روز رسانی میکنیم تا ویو را دوباره بسازد
items.add("new item");
adapter.notifyDataSetChanged();
//------------------------------------
items.remove(items.size()-1);
adapter.notifyDataSetChanged();
استفاده از کلاس در لیست ویو
یک کلاس تعریف میکنیم تا اجزای کلاس را بر اساس ان تعریف کنیم
public class MyContacts {
private String name;
public MyContacts(String name){
setName(name);
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Hi: " + name;
}
}
سپس لیست و اداپتور را از همین نوع کلاس تعریف میکنیم
نکته مهم در تعریف کلا متد toString هست که باید تعریف بشه

ساختن لیست ویو اختصاصی
برای اینکار یک اکتیویتی جدید ایجاد مکنیم و تمام اجزایی که میخواهیم را ایجاد میکنیم
سپس یک کلاس همانند ایحاد میکنیم تا از این اکتیوتی بعنوان لایه برای لیست ویو استفاده کند
این کلاس یک پیاده سازی کلاس اداپتر میباشد که لایه پیش فرض اون لایه خودمون هست
در کلاس توسط متد getView باید یک ویو برگردانیم؛ در ابتدا یک LayoutInflater ایجاد میکنیم و سپس به layout خودمون که ایجاد کرده بودیم متصل میکنیم
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
LayoutInflater lif = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = lif.inflate(R.layout.listviewdesgin,parent,false);
ImageView I = v.findViewById(R.id.imageView2);
I.setImageResource(R.drawable.an);
return v;
}
پارامتر convertView در تابع getView به ویو ها اشاره میکند
برای مثال اگر قبلا یک ویو دسرت کرده باشیم و return کرده باشیم، در بار بعدی که اسن تابع برای همون شی فراخوانی میشه، مقدار convertView به همان شی اشاره میکند
در نتیجه لازم نیست دوباره اون ویو رو بسازیم میتوانیم چک کنیم که اگر در حافظه وجود داشته باشه، از همون استفاده کنیم
اگر خالی باشد Null برمیگردونه در غیر اینصورت میفهمیم که ویو قبلا ساخته شده

LayoutInflater
فایل o دقیقه 1:16 دیده شود
از چیزی که جنس جاوا هست یک ویو از جنس inflater تحویل میدهد
handler && timer
یک هندلر باز میکنیم که بعد از زمان مشخصی یه تسک را ران کند
new Handler().postDelayed(new Runnable(){
@override
public void run(){
//process
}
} , 10000L );
توسط تایمر یک فرایند را هی تکرار میکنیم
گزینه Delay یعنی با تاخیر انجام بده
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
//process
}
}, /*Delay:*/ 0, /*duration:*/ 200);
Toast
میتوانیم toast ها را شبیه کانفیگ کنیم
Toast toast = Toast.makeText(this, "Test Color For Toast", Toast.LENGTH_LONG);
toast.getView().setBackgroundColor(0x7ff44436);
toast.show();
برای ایجاد از روی لایه ها باید یک Inflat بسازیم
this.context = context;
this.toast = new Toast(context);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.view = inflater.inflate(R.layout.colored_toast_layout, null);
toast.setView(view);
سپس به اجزای اون لایه از طریق view دسترسی داریم و در نهایت tast را show میکنیم
Spinner
برای نشان دادن یک لیست DropDown است
simpleSpinner = (Spinner) findViewById(R.id.simple_spinner);
simpleItems = getResources().getStringArray(R.array.tours);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, simpleItems);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
simpleSpinner.setAdapter(adapter);
که میتوانیم توسط Inflater هم انزا کاستومایز کنیم
package org.faradars.firstproject;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class CountrySpinnerAdapter extends BaseAdapter {
private Context context;
private int[] flags;
private String[] names;
private LayoutInflater inflater;
public CountrySpinnerAdapter(Context context, int[] countryFlagIds, String[] countryNames){
this.context = context;
this.flags = countryFlagIds;
this.names = countryNames;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return flags.length;
}
@Override
public Object getItem(int i) {
return names[i];
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
ViewHolder holder;
if(convertView == null){
convertView = inflater.inflate(R.layout.custom_spinner_item, viewGroup, false);
holder = new ViewHolder();
holder.country_flag = (ImageView) convertView.findViewById(R.id.country_flag);
holder.country_name = (TextView) convertView.findViewById(R.id.country_name);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.fill(position);
return convertView;
}
public class ViewHolder{
public ImageView country_flag;
public TextView country_name;
public void fill(int position){
country_flag.setImageResource(flags[position]);
country_name.setText(names[position]);
}
}
}
و یک ایجاد کننده میسازیم
private void initCustomSpinner() {
customSpinner = (Spinner) findViewById(R.id.custom_spinner);
final CountrySpinnerAdapter adapter = new CountrySpinnerAdapter(this, countryFlags, countryNames);
customSpinner.setAdapter(adapter);
customSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(SpinnerActivity.this,
(String) adapterView.getSelectedItem(),
Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}