ListView Project (4)
ListView project ေလးတစ္ခု အပ်င္းေျပ ေရးၾကည္႔ရေအာင္ဗ်ာ ... အပိုင္း ( 4 )
***********************
အပိုင္း ( 3 ) က ကိုယ္တိုင္ေရးႏိုင္ရန္ ခ်န္ထားေပးခဲ႔တဲ႔ အပိုင္းေလးကို ကြ်မ္းကြ်မ္းက်င္က်င္ေရးထားျပီး ျပီးခဲ႔သမွ်အပိုင္းေတြ ပိုင္ပိုင္ႏိုင္ႏိုင္ ျဖစ္ေနလိမ္႔မယ္လို႔ ေမွ်ာ္လင့္မိပါတယ္။
ဆက္ code ၾကရေအာင္ပါ။
ဆက္မ code ခင္ ကိုယ္ေရးေနတဲ႔ App မွာ ဘာႏွိပ္ရင္ ဘာျဖစ္ရမယ္ ဆိုတဲ႔ App/code logic ကို ရွင္းရွင္းလင္းလင္း သိေနရပါမယ္။ ရွိထားရပါမယ္။ ျပီးရင္ အဲ႔ဒီအတိုင္း error ကင္းကင္းနဲ႔ ျဖစ္ေအာင္ code ရတာပါ။
အခု App project က ဒီလိုပါ။
အခု App ထဲမွာ List စာရင္းတစ္ခု ရွိေနပါမယ္။
ဒီ စာရင္းထဲကို အခုဒီ AIDE Group ထဲက (ကိုယ္ထည္႔ထားခ်င္တဲ႔) လူတစ္ေယာက္ခ်င္းစီရဲ႕ အမည္၊ ဖုန္းနံပါတ္(ေတာင္းျပီး :) ) ၊ ကိုယ္က သူတို႔ကို သတ္မွတ္ထားတဲ႔ Level ဒီ သံုးခု data အခ်က္အလက္ေတြကို သြင္းယူ သိမ္းထားႏိုင္ရပါမယ္။
ဒီ စာရင္းက ဘာ data မွ မရွိေသးလို႔ အစမွာ ဗလာျဖစ္ေနပါမယ္။
ျပီး အေပါင္း Button ေလးကို ႏွိပ္လိုက္ပါက member တစ္ေယာက္ကို စာရင္းသြင္း record လုပ္ႏိုင္ဖို႔ Box တစ္ခု ေပၚလာျပီး အမည္၊ ဖုန္းနံပါတ္ ၊ Level ရိုက္သြင္းျပီး List စာရင္းမွာ ေဖာ္ျပရမွာပါ။
အခု အေပါင္း Button ကို ႏွိပ္လိုက္ရင္ Box တစ္ခု ေပၚလာေအာင္ code ပါမယ္။ Custom dialog ကို သံုးပါမယ္။
Beginner ေတြလည္း လိုက္ေရးႏိုင္ေအာင္ code ေနတာမို႔ တစ္ခ်ိဳ႕ေနရာေတြ သိျပီးသားသူေတြအတြက္ အပိုလို ျဖစ္ေနပါမယ္။ ဆိုကၠားနင္းသြားပါ။ :)
dialog ဆိုတာ သိမွာပါ ... ဖုန္းရဲ႕ မ်က္ႏွာျပင္အျပည္႕ မေပၚပဲ အလယ္ေခါင္မွာ Box အကြက္ေလးေပၚတာကို ေျပာတာပါ။ အလြယ္ dialog လို႔ပဲ ေခၚပါတယ္။ code နဲ႔ဆို DialogFragment လို႔ ေခၚပါတယ္။ Alert Dialog ဆို ေတာ္ေတာမ်ားမ်ား ေရးဖူးၾကပါတယ္။
အခု app မွာ အဲ႔ဒီလို dialog မ်ိဳး ေရးပါမယ္။ ဒါေပမယ္႔ ကိုယ္စိတ္ၾကိဳက္ TextView ေတြ Button ေတြထည္႔ထားတဲ႔ layout ကို ယူသံုးႏိုင္ေအာင္ ေရးမွာမို႔ customized (ကိုယ္စိတ္ၾကိဳက္ လုပ္ထားတဲ႔ ) dialog = Custom dialog လို႔ နားလည္ရပါတယ္။
ကိုယ္စိတ္ၾကိဳက္ Layout xml နဲ႔ ေရးမွာမို႔ xml ဖိုင္တစ္ခု ေရးဖို႔လိုပါတယ္။ ေရးရေအာင္ပါ။ new_member_dialog.xml ဆိုတဲ႔ နာမည္နဲ႔ xml ဖိုင္တစ္ခု Layout folder ထဲမွာ အသစ္ေခၚဖြင့္ပါ။
EditText သံုးခု ၊ Button ႏွစ္ခု ပါေအာင္ စိတ္ၾကိဳက္ေရးထားပါ။ က်ေနာ္႔ layout အၾကမ္းကို ဒီ post ေအာက္ဆံုးမွာ ေပးထားပါမယ္။ ပံုထဲက ပံုစံကိုလည္း ၾကည္႔ေရးႏိုင္ပါတယ္။
ဟုတ္ပါျပီ။ layout အတြက္ ေရးျပီးပါျပီ။ ဒါဆို က်ေနာ္တို႔က Custom dialog တစ္ခု ျဖစ္ေအာင္ လုပ္ဖို႔ class တစ္ခု ေရးရပါမယ္။ MainActivity.java ဖိုင္ ရွိတဲ႔ေနရာကေန Add New Class ကေနတစ္ဆင့္ MySpecialDialog ဆိုတဲ႔ နာမည္နဲ႔ class ဖိုင္အသစ္ ဖြင့္လိုက္ပါ။
ဒါဆို class တစ္ခုရဲ႕ Template တည္ေဆာက္ပံု အၾကမ္း auto ေပးထားတာကို အခုလို ေတြ႕ရပါမယ္။
public class MySpecialDialog
{
}
အေပၚမွာ ေျပာခဲ႔ပါတယ္။ Dialog ကို code အရ DialogFragment လို႔ ေခၚတယ္ဆိုတာကို။ အခု က်ေနာ္တို႔ ေရးေနတာဟာလည္း Dialog တစ္ခုအတြက္ပဲဆိုေတာ႔ က်ေနာ္တို႔ class ကို Dialog Object တစ္ခုျဖစ္ေအာင္ DialogFragment ကို extends ဆိုတဲ႔ keyword နဲ႔ ဆင့္ကူး extends လုပ္ယူရပါမယ္။ extends လုပ္လုိုက္ပါ။
public class MySpecialDialog extends DialogFragment
{
}
အနီလိုင္း error ေတြ ေပၚလာခဲ႔ရင္ fix imports လုပ္ဖို႔ မေမ႔ပါနဲ႔။ ဒီလိုလုပ္လိုက္တဲ႔အတြက္ အခု က်ေနာ္တို႔ MySpecialDialog ဟာ an instance of DialogFragment ( DialogFragment တစ္ခု ျဖစ္သြားပါျပီ။) ဆိုလိုတာက က်ေနာ္တို႔ class က သူ႔အထက္က DialogFragment class ကို extends ဆင့္ကူးထားတာမို႔ သူ႔ မိခင္ DialogFragment class ထဲက method ေတြကို ယူသံုးႏိုင္ပါျပီ။ ဆိုေတာ႔ extends လုပ္တဲ႔ မူရင္း class ကို super class လို႔ေခၚျပီး extends လုပ္ယူထားတဲ႔ class ကို sub class လို႔ java မွာ ေခၚပါတယ္။ ဒါဆို မူရင္းမိခင္ class ျဖစ္တဲ႔ DialogFragment က super class ျဖစ္ျပီး၊ က်ေနာ္တို႔ MySpecialDialog class က sub class ျဖစ္ပါမယ္။
Java မွာ class တစ္ခု ေရးရင္ class constructor ဆိုတာ ရွိပါတယ္။ တစ္ျခားမဟုတ္ပါဘူး method တစ္ခုပါပဲ။ class method ဆိုရင္လည္း မွန္ပါတယ္။ အဲ႔ဒီ method နာမည္က Class နာမည္နဲ႔ နာမည္တူပါတယ္။
ဒါဆို အရင္အပိုင္းက method တစ္ခု ေရးနည္းအတိုင္း ေရးရင္း အခုလို ရလာပါမယ္။
public void MySpecialDialog() {
}
ဒီေနရာမွ မွတ္သားစရာ တစ္ခုတိုးလာပါျပီ။ method နဲ႔ class constructor ဘာကြာပါသလဲ? ဆိုတာပါ။ ok ပါ constructor တစ္ခုမွာ return type မပါပါဘူး။ ဒါ method နဲ႔ class constructor ရဲ႕ အဓိက ကြာျခားခ်က္ပဲ ျဖစ္ပါတယ္။ ဒါေၾကာင့္ အေပၚက ေရးထားတဲ႔ class method မွာ return type ျဖစ္တဲ႔ void ဆိုတာကို ျဖဳတ္ပစ္ရပါမယ္။ ဒါဆို ဒီလို ရလာပါမယ္။
public MySpecialDialog() {
}
Java မွာ public ဆိုတဲ႔ modifier ကို ထည္႔မေရးလည္း ရပါတယ္။ ဘာမွ ေရးမထားရင္ public modifier ဆိုတာ နားလည္ေနရပါမယ္။ ဒါဆို ျဖဳတ္လိုက္ရင္ အခုလို ရလာပါမယ္။
MySpecialDialog() {
}
က်ေနာ္တို႔က အခု MySpecialDialog ကို လွမ္းေခၚဖြင့္ခ်င္တဲ႔ အခါ အခု ေရးခဲ႔တဲ႔ constructor ကို လွမ္းေခၚဖြင့္မွာပါ။
myDialog = new MySpecialDialog();
ေနာက္ထပ္မွတ္သားစရာ တိုးလာျပန္ပါျပီ။ ဒီလို class constructor ေတြကို Java မွာ ထည္႔ေရးရင္လည္း ရတယ္။ မေရးလည္း ရတယ္ ဆိုတာပါပဲ။ ဒါေၾကာင့္ တစ္ခ်ိဳ႔ developer ေတြ ေရးထားတဲ႔ class ဖိုင္ေတြမွာ အခုလို constructor ပါ ထည္႔ေရးထားတဲ႔ သူေတြ ရွိသလို ထည္႔မေရးထားတဲ႔သူေတြလည္း ေတြ႕ႏိုင္တာ ျဖစ္ပါတယ္။ ထည္႔မေရးထားတဲ႕ class ေတြမွာ Runtime မွာ စက္က auto ထည္႔ေပးသြားပါတယ္။ ဒါေၾကာင့္ မေရးလည္းရတယ္။ ေရးလည္း ရတယ္ ျဖစ္တာပါ။
ဒါေပမယ္႔ အခု က်ေနာ္တို႔ ေရးေနတဲ႔ class မွာေတာ႔ မျဖစ္မေန ထည္႔ေပးရပါမယ္။ ေနာက္အပိုင္းေတြမွာ ဒီ constructor အဝင္ point ကေန လိုအပ္တဲ႔ data ေတြကို input အျဖစ္ေတာင္းယူ pass လုပ္ျပီး class ထဲ သံုးသြားခ်င္လို႔ပါ။ ဒါေၾကာင့္ အခု constructor ပိုင္းကို ထည္႔ေရးေပးတာ ျဖစ္ပါတယ္။ ဒါဆို constructor ပါ ပါတဲ႔ က်ေနာ္တို႔ class ေလး အခုလို ရလာပါမယ္။
public class MySpecialDialog extends DialogFragment
{
MySpecialDialog() {
}
}
အခု class ဟာ DialogFragment instance (အမ်ိဳးအစား) ဆိုတာ မေမ႔ပါနဲ႔ဦး။
Dialog တစ္ခုမွာ Title bar ထည္႔မွာလည္း မထည္႔ဘူးလား ဆိုတဲ႕ style ေတြ theme ေတြကို Google က ေပးထားပါတယ္။ ဒါကို က်ေနာ္တို႔က ထည္႔မထည္႔ code နဲ႔ ေရးေပးလိုက္ရံုပါပဲ။ ဘယ္လို ဘယ္ေနရာမွာ ေရးကမွာလဲ ? ဟုတ္ကဲ႔ @Override လုပ္ျပီး ေရးရပါမယ္။ ဟမ္! .. @Override က ဘာၾကီးတုန္း တို႔ လုပ္တတ္ဘူး ဆိုျပီး ေၾကာက္မသြားပါဦး။ @Override ဆိုတာကို သေဘာတရား အၾကမ္းနားလည္ထားရင္ ရပါျပီ။
@Override ဆိုတာ အျခားမဟုတ္ပါဘူး။ ကိုယ္႔ class က extends လွမ္းယူထားတဲ႔ မိခင္ super class က ေပးထားတဲ႔ method ေတြကို နာမည္တူ method နဲ႔ ကိုယ္႔စိတ္ၾကိဳက္ ျပန္ျပင္ေရးယူတာပါပဲ။ method ႏွစ္ခုဟာ နာမည္တူေနတဲ႔အတြက္ အခုေရးလိုက္တဲ႔ ကိုယ္႔ class ထဲက method ဟာ မိခင္ super class ထဲက method ကို run တဲ႔အခ်ိန္ @Override သတ္မွတ္ထားတဲ႔ အခုက်ေနာ္တို႔ subclass method ဆီ ေရာက္လာတာမို႔ အဲ႔ဒီအခ်ိန္မွာ လိုအပ္တာေတြ ျပင္ေရးေပးတာပါ။ ထားပါေတာ႔ ဒီအပိုင္းကို ဒီေလာက္နဲ႔။
အခု က်ေနာ္တို႔ extends လုပ္ထားတဲ႔ မိခင္ super class မွာ onCreate() ဆိုတဲ႔ method တစ္ခု ရွိပါတယ္။ Dialog တစ္ခု စတင္ပြင့္ဖို႔ အစျပဳတဲ႔ method ပါ။ က်ေနာ္တို႔ MainActivity ရဲ႕ onCreate( ) လို အဝင္ point လို႔ အၾကမ္းဖ်င္း နားလည္ရပါတယ္။
အခု အဲ႔ method ကို က်ေနာ္တို႔ MySpecialDialog class ထဲမွာ @Override လွမ္းယူ ေရးပါမယ္။ Dialog ကို style ေတြ them ေတြကို စိတ္ၾကိဳက္ ထားခ်င္လို႔ပါ။
code ေတြ အမ်ားၾကီး အမ်ားၾကီး အလြတ္ေရးသြားဖို႔ မလိုပါဘူး။ က်ေနာ္တို႔ class ထဲမွာ onCrea ဆိုျပီး က်ေနာ္တို႔ @Override လုပ္မယ္႔ method နာမည္ကို မျပည္႔မစံုေလး ေရးျပီး auto complete box ေပၚအလာေစာင့္ျပီး ႏွိပ္ေပးလ္ုက္ရံုပါ။ ဒါဆို အခုလို ရလာပါမယ္။
public class MySpecialDialog extends DialogFragment
{
MySpecialDialog() {
}
@Override
public void onCreate(Bundle savedInstanceState)
{
// TODO: Implement this method
super.onCreate(savedInstanceState);
}
}
မိခင္ super class က return type void ျဖစ္ေနတဲ႔ method တစ္ခုကို @Override လုပ္တိုင္း မိခင္ class ရဲ႕ method ကို ျပန္ run ေပးရပါတယ္။ method ကို run ေစတာကို method call လုပ္တယ္လို႔ သံုးပါတယ္။ ဆိုေတာ႔ မိခင္ class ကို super လို႔ သံုးတဲ႔အတြက္ super class ( . ) ဆီက (. က member access operator ပါ) onCreate(...) method ကို call လုပ္ေပးဖို႔
super.onCreate(savedInstanceState);
code ကို က်ေနာ္တို႔ အခု @Override လုပ္တဲ႔ method မွာ auto ေပးထားျခင္းျဖစ္ပါတယ္။
အခု method အတြင္းမွာပဲ
int style = DialogFragment.STYLE_NO_TITLE, theme = 0;
setStyle(style,theme);
setCancelable(true);
code ေတြေရးျပီး က်ေနာ္တို႔လိုခ်င္တဲ႔ Dialog ရဲ႕ style နဲ႔ theme ကို ေျပာင္းယူပါတယ္။ ဒါဆို ဒီလို ရလာျပီ ျဖစ္ပါတယ္။
public class MySpecialDialog extends DialogFragment
{
MySpecialDialog() {
}
@Override
public void onCreate(Bundle savedInstanceState)
{
// TODO: Implement this method
super.onCreate(savedInstanceState);
int style = DialogFragment.STYLE_NO_TITLE, theme = 0;
setStyle(style,theme);
setCancelable(true);
}
}
အခု style နဲ႔ theme ကိုပဲ ေျပာင္းယူရပါေသးတယ္။ ဒီတစ္ခါ Dialog box အတြက္ ကိုယ္သံုးခ်င္တဲ႔ layout View ကို ဆြဲယူသံုးႏိုင္ေအာင္ လုပ္ဖို႔ မိခင္ super class က Dialog box View ကို ဘယ္ method က ဖန္တီီးေပးတာလဲဆိုတာကို ေလ႔လာၾကည္႔ေတာ႔ onCreateView(...) method က လုပ္ေပးတယ္ဆိုတာ ေတြ႕ရပါတယ္။ က်ေနာ္တို႔ သံုးခ်င္တဲ႔ layout ကို ယူသံုးဖို႔ဆိုရင္ ဒီ method က create လုပ္ေပးတဲ႔ View ကို က်ေနာ္တို႔က မွန္မွန္ကန္ကန္ ဖန္တီးေပးျပီး အစားထိုး ေပးလိုက္ရင္ ရပါျပီ။ မိခင္ class ရဲ႕ method တစ္ခု အလုပ္လုပ္တာ ေျပာင္းလဲပစ္ခ်င္ရင္ @Override လုပ္ေပးရံုပါပဲ။
ဒါေၾကာင့္ ေစာေစာကအတိုင္းပဲ onCreteV... မျပည္႔မစံုေရးျပီး auto complete သံုးျပီး ေရးခ်လိုက္ပါ။ ဒီလိုရလာမွာ ျဖစ္ပါတယ္။
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// TODO: Implement this method
return super.onCreateView(inflater, container, savedInstanceState);
}
ေစာေစာက ေျပာခဲ႔ပါတယ္။ မိခင္ super class မွာ ဒီ method က Dialog အတြက္ UI View ကို ဖန္တီးေပးဖို႔ တာဝန္ယူထားတဲ႔ method ဆိုတာ။ ဒီ method က အဲ့ဒီ View ကို ဖန္တီးထုတ္ေပးရတာပါ။ ဒါေၾကာင့္ ဒီ method က ျပန္ထုတ္ေပးတဲ႔ return type ဟာ View ဆိုတာကို public modifier ေနာက္မွာ ေတြ႕ႏိုင္ပါတယ္။ က်ေနာ္တို႔က အခုလို View ကို ကိုယ္စိတ္ၾကိဳက္ ေရးဆြဲထားတဲ႔ layout နဲ႔ View တစ္ခု ဖန္တီးျပီး အစားထိုး ေျပာင္းေပးလိုက္ျပီး return ျပန္ေပးလိုက္ရင္ OK ပါျပီ။
ဆိုေတာ႔ Layout View တစ္ခုကို ဆြဲယူဖန္တီးရာမွာ LayoutInflater ကို သံုးရမွာပါ။ ဒါဆို ဒီ LayoutInflater object ဘယ္က ရႏိုင္မလဲ? အခု method မွာ အဝင္ input ကို လက္ခံတဲ႔ ( ) လက္သည္းကြင္းထဲမွာ LayoutInflater inflater ဆိုျပီး LayoutInflator object ကို inflator ဆိုတဲ႔ နာမည္နဲ႔ ေပးထားတယ္ဆိုတာ ေတြ႕ရမွာပါ။ သူ႔ကို ယူသံုးရံုပါပဲ။
LayoutInflator မွာ inflate(...) ဆိုတဲ႔ method ရွိပါတယ္။ သူကေန run ျပီး View ဖန္တီးထုတ္ေပးတာပါ။
View rootLayout = inflater.inflate(R.layout.new_member_dialog, container, false);
ဒီေနရာမွာ က်ေနာ္တို႔ စိတ္ၾကိဳက္ ေရးဆြဲထားတဲ႔ layout xml ဖိုင္ကို R.layout.xxxxx ကေန ဆြဲယူအသံုးျပဳလိုက္တယ္ဆိုတာ သတိျပဳပါ။
ျပီးေတာ႔ inflate() method ထဲက container တို႔ false ဆိုတဲ႔ boolean တန္ဖိုး အလုပ္လုပ္ပံုကိုေတာ႔ သီးျခားေခါင္းစဥ္တစ္ခုေအာက္မွာ ကိုယ္တိုင္ေလ႔လာသြားဖို႔ အၾကံျပဳပါတယ္။ အခုေနအခါမွာေတာ႔ ဒီေလာက္အၾကမ္းဖ်င္း သိထားရင္ပဲ OK ပါျပီ။
ရလာတဲ႔ rootLayout ဆိုတဲ႔ View object ကို return ျပန္ထုတ္ေပးလိုက္ရံုပါပဲ။ ဒါဆို အေပၚက method ကို ျပင္ေရးလိုုက္ရင္ အခုလို ရလာမွာ ျဖစ္ပါတယ္။
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View rootLayout = inflater.inflate(R.layout.new_member_dialog, container, false);
return rootLayout;
}
ဒီအထိ @Override method ႏွစ္ခုနဲ႔ ကိုယ္လိုခ်င္တဲ႕ Custom Dialog ကို အသံုးျပဳမယ္ ဆိုရင္လည္း ရေနပါျပီ။ ဒါေပမယ္႔ အခုတိုင္းသံုးရင္ ကိုယ္ေရးထားတဲ႔ layout မွာ အဝိုင္း drawable ေတြနဲ႔ ေနာက္ခံ ေပးထားတာေတြ ပါေနရင္ Dialog Box ထည္႔ျပတဲ႔ window ထဲမွာ ကိုယ္႔ Layout အဝိုင္း background က လြတ္ေနတဲ႔ ေနရာေတြမွာ မူရင္း window ရဲ႕ default ကာလာ (အျဖဴ/အမည္း) က ေပၚေနပါမယ္။ ၾကည္႔ရ အဆင္မေျပပါ။
ဒါကို ေဖ်ာက္ခ်င္ရင္ က်ေနာ္တို႔က Dialog စေပၚတဲ႔အခ်ိန္မွာ အဲ႔ဒီ Dialog ရဲ႕ window ကို ဖမ္းယူျပီး background ကို ေဖ်ာက္ေပးလိုက္ရင္ ရပါျပီ။
ဒီလိုလုပ္ႏိုင္ဖို႔ မိခင္ super class မွာ Dialog စ ေပၚေအာင္ တာဝန္ယူရတဲ႔ method ရွိလား ဘယ္ method လဲဆိုတာၾကည္႔ရပါတယ္။ ရွိရင္ အေပၚကအတိုင္း @Override လုပ္ ေျပာင္းယူပါမယ္။
method တစ္ခုေတာ႔ ေတြ႔ပါတယ္။ onCreateDialog(...) ဆိုတဲ႔ method ပါ။ သူ႔က return type အျဖစ္ Dialog ျပန္ထုတ္ေပးထားတာ ရွိပါတယ္။ ဒါ က်ေနာ္တို႔ ရွာေနတဲ႔ Dialog object မ်ားျဖစ္ေနမလားပါ ? ဘာပဲျဖစ္ျဖစ္ @Override လုပ္ၾကည္႔ရေအာင္ပါ။ ေစာေစကအတိုင္း onCreateD ဆိုျပီး method နာမည္ကို မျပည္႔မစံုေလးေရးျပီး auto complete သံုးေရးခ်လိုက္ပါ။ ဒီလို ရလာပါမယ္။
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
// TODO: Implement this method
return super.onCreateDialog(savedInstanceState);
}
return type ကို ၾကည္႔ပါ။ Dialog object အျဖစ္ မိခင္ class က ရလာမယ္႔ Dialog ကို ယူျပီး ျပန္ထုတ္ေပးထားပါတယ္။
return super.onCreateDialog(savedInstanceState);
ဒါ Dialog object ျဖစ္မွာေပါ႔။ ဖမ္းယူလိုက္ပါ။
Dialog dialog = super.onCreateDialog(savedInstanceState);
Dialog object ကို dialog ဆိုတဲ႔ နာမည္ေလးနဲ႔ ဖမ္းယူလိုက္ႏိုင္ပါျပီ။ ဒီ object ကေန dialog window လွမ္းယူရမရ ဖမ္းယူထားတဲ႔ dialog object ေလးေပၚကို method နာမည္ေတြနဲ႔ ေထာက္ျပီး auto complete လုပ္ မွန္းယူရပါတယ္။
dialog.setM...
dialog.dis ....
အဆံုးမွာ getWindow() ဆိုတဲ႔ window လွမ္းယူႏိုင္တဲ႔ method တစ္ခုေတြ႕ပါတယ္။
သံုးၾကည္႔လိုက္ပါတယ္။
dialog.getWindow()
ဒါဆို က်ေနာ္တို႔ လက္ထဲမွာ Dialog ရဲ႕ window ေရာက္ေနျပီ ေျပာလို႔ရပါတယ္။ ဒါနဲ႔ အဲ႔ window ကို background တစ္ခုခု ေပး ရ မရ setBackgroundResources() ဘာညာနဲ႕ background ထည္႔ေပးတဲ႔ method ေတြနဲ႔ ေစာေစာကလို method auto complete နဲ႔ မွန္းျပီး ယူၾကည္႔ပါတယ္။
အဲလိုလုပ္ၾကည္႔လုိက္ေတာ႔
setBackgroundDrawable ()
method နဲ႔ သံုးလို႔ရတာ ေတြ႕လိုက္ရေတာ႔ ေနာက္ခံေပ်ာက္ TRANPARENT ColorDrawable တစ္ခုကို ဖန္တီးျပီး ထည္႔ေပးလိုက္ပါတယ္။
new ColorDrawable(Color.TRANSPARENT)
အဆံုး code ကေတာ႔ dialog object ကို ေနာက္ခံအေပ်ာက္ထည္႔ျပီးသား ရလာတယ္ေပါ႔။
dialog.getWindow().setBackgroundDrawable (new ColorDrawable(Color.TRANSPARENT));
ဒီ ျပင္ဆင္ျပီးသား dialog object ကို return ျပန္ထုတ္ေပးလိုက္တာပါပဲ။
return dialog;
ဒါဆို အခုေနာက္ဆံုး @Override လုပ္လိုက္တဲ႔ method က အခုလို ရလာတယ္ေပါ႔။
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.getWindow().setBackgroundDrawable (new ColorDrawable(Color.TRANSPARENT));
return dialog;
}
ဒါဆို မူရင္း Dialog Box ကို Custom Dialog Box အျဖစ္ method သံုးခုကို @Override လုပ္လိုက္တာနဲ႔ အရန္သင့္သံုးႏိုင္တဲ႔ class တစ္ခု ရပါျပီ။
အခု Dialog Box ဖြင့္ဖို႔ MainActivity class ဆီ သြားပါမယ္။ အရင္ အပိုင္းက ေရးခဲ႔တဲ႔ onClick method ေတြေအာက္ကို method ေလးတစ္ခု ဖန္တီးေရးေပးရေအာင္ပါ။
private void showMyDialog() {
}
အခု method ထဲမွာ ေစာေစာက Dialog class ကို လွမ္းယူဖြင့္ဖို႔ code ႏွစ္ေၾကာင္းပဲ လိုပါတယ္။
ဒီအပိုင္းရဲ႕ အစမွာ ေျပာခဲ႔ပါတယ္။ Dailog ဆိုတာ DialogFragment ကို ေခၚတာပါလို႔ပါ။
ဒါဆို ေစာေစာက က်ေနာ္တို႔ ေရးလိုက္တဲ႔ MySpecialDialog class ဟာလဲ DialogFragment ကို ဆင့္ကူး extends လုပ္ထားတဲ႔ DialogFragment အမ်ိဳးအစား instance ပါပဲ။
ဒီေတာ႔ Dialog Box ျပခ်င္ရင္ ေစာေစာက ေရးလိုက္တဲ႔ class ကို new (operator) နဲ႔ instance တစ္ခု ဖန္တီးေပးျပီး ...
DialogFragment mDialog = new MySpecialDialog();
Dialog တစ္ခုကို ျပေပးတဲ႔ show(...) method ယူသံုးျပီး ျပေပးလိုက္ရင္ ရပါျပီ။
mDialog.show(getFragmentManager(),"Dialog");
ဒါဆို Dialog ဖြင့္ဖို႔ method က ဒီလိုရလာပါမယ္။
private void showMyDialog() {
DialogFragment mDialog = new MySpecialDialog();
mDialog.show(getFragmentManager(),"Dialog");
}
ေနာက္ဆံုးအေနနဲ႔ က်ေနာ္တို႔က plus Button အေပါင္းကို ႏွိပ္ရင္ Dialog Box ပြင့္ခ်င္တာဆိုေတာ႔ အခု method ကို plusButton onClick method ထဲကေန method call လုပ္ျပီး လွမ္း run အလုပ္ လုပ္ေစလိုက္ေပါ႔။
// Plus Button onClick() method
public void clickPlusButton(View v) {
Toast.makeText(this,"Plus Button Clicked",Toast.LENGTH_SHORT).show();
showMyDialog();
}
ဒါဆို ဒီအပိုင္း ဒီမွာ ျပီးပါျပီ။ App ကို build လုပ္ စမ္းသပ္ပါ။ error မရွိရပါ။ force closed မျဖစ္ရပါ။
new_member_dialog.xml
=====================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#E02D22"
android:padding="15dp">
<TextView
android:layout_height="wrap_content"
android:text="New Member"
android:layout_width="wrap_content"
android:textColor="#FFFFFF"
android:textSize="18sp"
android:id="@+id/dialogTextView1"
android:layout_centerHorizontal="true"/>
<EditText
android:layout_height="wrap_content"
android:ems="10"
android:layout_width="wrap_content"
android:layout_below="@+id/tv"
android:id="@+id/dialogEditText1"
android:textColor="#FFFFFF"/>
<TextView
android:layout_height="wrap_content"
android:text="Phone :"
android:layout_width="wrap_content"
android:layout_below="@id/dialogEditText1"
android:textColor="#FFFFFF"
android:textSize="15sp"
android:id="@+id/dialogTextView2"/>
<EditText
android:layout_height="wrap_content"
android:ems="10"
android:layout_width="wrap_content"
android:layout_below="@id/dialogTextView2"
android:inputType="number"
android:id="@+id/dialogEditText2"
android:textColor="#FEFEFE"/>
<TextView
android:layout_height="wrap_content"
android:text="Level (1/2/3) :"
android:layout_width="wrap_content"
android:layout_below="@id/dialogEditText2"
android:textColor="#FFFFFF"
android:textSize="15sp"
android:id="@+id/dialogTextView3"/>
<EditText
android:layout_height="wrap_content"
android:ems="10"
android:layout_width="wrap_content"
android:layout_below="@id/dialogTextView3"
android:inputType="number"
android:textColor="#FFFFFF"
android:id="@+id/dialogEditText3"/>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_below="@id/dialogEditText3"
android:gravity="center"
android:layout_marginTop="10dp">
<Button
android:layout_height="wrap_content"
style="?android:attr/buttonStyleSmall"
android:text="Cancel"
android:layout_width="wrap_content"
android:layout_marginRight="25dp"
android:textColor="#FFFFFF"
android:minWidth="75dp"
android:maxWidth="75dp"/>
<Button
android:layout_height="wrap_content"
style="?android:attr/buttonStyleSmall"
android:text="Add"
android:layout_width="wrap_content"
android:textColor="#FFFFFF"
android:minWidth="75dp"/>
</LinearLayout>
<TextView
android:layout_height="wrap_content"
android:text="Name :"
android:layout_width="wrap_content"
android:layout_below="@id/dialogTextView1"
android:id="@+id/tv"
android:textColor="#FFFFFF"
android:textSize="15sp"/>
</RelativeLayout>
-----------------------------------------
အပိုင္း ( 5 ) ေမွ်ာ္ .... :)
ကိုမ်ိဳး
AIDE Android Lessons And Project Group
မွကူးယူတင္ထားပါသည္
#mkk_ListView
Comments
Post a Comment
Thank,s for ...