ایجاد ui با استفاده از کد نویسی و ثبت (Registerکردن ) event ها برای View ها
بسم الله الرحمن الرحیم
ایجاد ui با استفاده از کد نویسی و ثبت (Registerکردن ) event ها برای View ها
فصل سوم-بخش سوم
قبلا ui برنامه ها را با فایل xml ایجاد می کردیم. در کنار این روش شما می توانید ui مور نظرتان را با کد نویس ایجادکنید. این روش زمانی که شما بخواهید ui در زمان اجرا ایجادکنید بسیار مفیدمی باشد
در مثال زیریک ui را با کدنویسی ایجاد می کنیم.
1- یک پروژه جدید با نامUICode ایجادکرده
2- دستورات زیر رادر آن بنویسید.
package com.MehrdadJavidi.uicode;
import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**setContentView(R.layout.main);*/
/**---param for views---*/
LayoutParams params =
new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT);
/**---create a layout---*/
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
/**---create a textview---*/
TextView tv = new TextView(this);
tv.setText("This is a TextView");
tv.setLayoutParams(params);
/**---create a button---*/
Button btn = new Button(this);
btn.setText("This is a Button");
btn.setLayoutParams(params);
/**---adds the textview---*/
layout.addView(tv);
/**---adds the button---*/
layout.addView(btn);
/**---create a layout param for the layout---*/
LinearLayout.LayoutParams layoutParam =
new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT );
this.addContentView(layout, layoutParam);
}
}
F11 را فشار دهید تا برنامه اجرا شود.
توضیحات
در این مثال مشاهده می کنید که با دستور setContentView() , ui برنامه را از فایل main.xmlبارگزاری نمی کنیم
شما یک شی LayoutParams ایجاد کردیدکه پارامترlayout مربوط به View ها ی که ایجاد کردید تعیین می کند.
LayoutParams params =
new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT);
سپس شمایک LinearLayout ایجاد کردید که در بر گیرنده تمام View های می باشد که در برنامه ایجاد می کنید می باشد.
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
سپس شما یک TextView و Button ایجاکردید.
/**---create a textview---*/
TextView tv = new TextView(this);
tv.setText("This is a TextView");
tv.setLayoutParams(params);
/**---create a button---*/
Button btn = new Button(this);
btn.setText("This is a Button");
btn.setLayoutParams(params);
/**---adds the textview---*/
btn.setLayoutParams(params);
بعد آنها را به اضافه LinearLayout کردید.
/**---adds the textview---*/
layout.addView(tv);
/**---adds the button---*/
layout.addView(btn);
سپس شما LayoutParams یک ایجادکردیدکه توسط شیLinearLayout استفاده می شود.
LinearLayout.LayoutParams layoutParam =
new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT );
و در آخر هم شیLinearLayout را به Activity اضافه کردید.
this.addContentView(layout, layoutParam);
گوش داده به UI Notification ها
کاربران در 2 سطح با Ui در تعامل هستند. 1: در سطح Activity 2 : در سطح View
در سطح Activity کلاس Activity متد های در اختیار شما قرار می دهد که شما می توانید آن را override. کنید
برخی از متد های که شما می توانید که در activity شما می توانید override کنید موارد زیر می باشند
- onKeyDown : زمانی که یک کلید فشار داده می شود اجرا می شود. توسط View های که در Activity هستند کنترل نمی شود.
- onKeyUp: زمانی که یک کلید فشار داده شده رها شود اجرا می شود توسط View های که در Activity هستند کنترل نمی شود.
- onMenuItemSelected زمانی که منو های انتخاب می شوند اجرا می شود که در فصل 5 شرح می دهیم
- onMenuOpened:زمانی که پنل منو ها نمایش داده می شوند اجرا می شود
Override کردن متد ها تعریف شده در Activity ها
برای انکه شرح دهیم که چگونه Activity ها با کاربران در تعامل هستند آن را با یک مثال شرح می دهیم و بعضی از متد ها که از کلاس پایه Activity مشتق شده اند را override می کنیم
پروژه جدید به نام UIActivity. ایجاد کنید
دستورات زیر را در main.xml قرار دهید.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="214dp"
android:layout_height="wrap_content"
android:text="Your Name" />
<EditText
android:id="@+id/txt1"
android:layout_width="214dp"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn1"
android:layout_width="106dp"
android:layout_height="wrap_content"
android:text="OK" />
<Button
android:id="@+id/btn2"
android:layout_width="106dp"
android:layout_height="wrap_content"
android:text="Cancel" />
</LinearLayout>
دستورات زیر را در فایل mainActivity.java قرار دهید
package com.MehrdadJavidi.uiactivity;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.Toast;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
Toast.makeText(getBaseContext(),
"Center was clicked",
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
Toast.makeText(getBaseContext(),
"Left arrow was clicked",
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
Toast.makeText(getBaseContext(),
"Right arrow was clicked",
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_UP:
Toast.makeText(getBaseContext(),
"Up arrow was clicked",
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
Toast.makeText(getBaseContext(),
"Down arrow was clicked",
Toast.LENGTH_LONG).show();
break;
}
return false;
}
}
توضیحات
زمانی که بactivity بار گذاری می شود شما اشاره گر چشمک زن رو در EditText می بینید
در activity ما متد onKeyDown() را override کردیم
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
Toast.makeText(getBaseContext(),
"Center was clicked",
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
Toast.makeText(getBaseContext(),
"Left arrow was clicked",
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
Toast.makeText(getBaseContext(),
"Right arrow was clicked",
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_UP:
Toast.makeText(getBaseContext(),
"Up arrow was clicked",
Toast.LENGTH_LONG).show();
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
Toast.makeText(getBaseContext(),
"Down arrow was clicked",
Toast.LENGTH_LONG).show();
break;
}
return ;
}
ثبت (Registerکردن ) event ها برای View ها
View ها می توانید یک رویداد را زمانی که باکاربر در تعامل هستند را اجرا کنند.
به عنوان مثال زمانی که کاربر بر روی یگ button کلیک می کند باید عملیاتی انجام شود و شما نیاز دارید که به طور صریح رویداد برای آنها ثبت کنید. که در ادامه آن را با یک مثال شرح می دهیم
به پروژه قبلی رفته و دستورات زیر را در mainActivity وارد نمایید.
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/**---the two buttons are wired to the same event handler---*/
Button btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(btnListener);
Button btn2 = (Button)findViewById(R.id.btn2);
btn2.setOnClickListener(btnListener);
}
/**---create an anonymous class to act as a button click listener---*/
private OnClickListener btnListener = new OnClickListener()
{
public void onClick(View v)
{
Toast.makeText(getBaseContext(),
((Button) v).getText() + " was clicked",
Toast.LENGTH_LONG).show();
}
};
برنامه را اجرا کنید.
بر روی دکمه های Okو Cancel کلیک کنید.
در کنار روش بالا که پارامتر setOnClickListener را متد btnListener دادیم که این روش را به عنوان anonymous class شناخته می شود روش دیگر هم وجود دارد که به عنوان anonymous inner class شناخته می شود نیازی به تعریف متد جداگانه ای نمی باشد. که در ادامه آن را به یک مثال شرح می دهیم
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/**---the two buttons are wired to the same event handler---*/
Button btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(btnListener);
Button btn2 = (Button)findViewById(R.id.btn2);
btn2.setOnClickListener(btnListener);
/**---create an anonymous inner class to act as an onfocus listener---*/
EditText txt1 = (EditText)findViewById(R.id.txt1);
txt1.setOnFocusChangeListener(new View.OnFocusChangeListener()
{
@Override
public void onFocusChange(View v, boolean hasFocus) {
Toast.makeText(getBaseContext(),
((EditText) v).getId() + " has focus -" + hasFocus,
Toast.LENGTH_LONG).show();
}
});
}
برای تعیین رویداد button به روش anonymous inner class به صورت زیر عمل می کنیم
Button btn1 = (Button)findViewById(R.id.btn1);
/**btn1.setOnClickListener(btnListener);*/
btn1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
/**---do something---*/
}
});
Button btn2 = (Button)findViewById(R.id.btn2);
/**btn2.setOnClickListener(btnListener);*/
btn2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
/**---do something---*/
}
});