Tổng hợp kĩ thuật android nâng cao và sử dụng firebase

50 166 1
Tổng hợp kĩ thuật android nâng cao và sử dụng firebase

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Kĩ thuật Android nâng cao, là các skill, phần nâng cao của khóa học Android cơ bản nâng cao do Vũ Xuân Trường đã áp dụng trên Android Studio, chia sẻ 10 ứng dụng do tôi viết và một số trang dạy lập trình nổi tiếng Việt nam và nước ngoài

T h ợp k ĩ thu ật Android nâng cao tác gi ả:V ũXuân Tr ườ ng Google Store: https://play.google.com/store/apps/dev?id=8951765077713242613 Bài 1: Gi ới thi ệu chung v ề Android Android gì? -Là hệ điều hành thiết bị di động smartphone phát triển bới Google dựa hệ điều hành Linux -Các ứng dụng Android phát triển dựa ngôn ngữ Java Tại phải học Android? -Ngày thiết bị di động sử dụng Android phát triển ngày mạnh mẽ Những kiến thức để học Android -Căn kĩ thuật lập trình -Java -Chịu khó Bài 2: Cách cài máy ảo thống Emulator Android Studio Bước 1: Tải cài Android Studio trang chủ Android( https://developer.android.com/studi o) Bước 2: Tải phần mềm hỗ trợ tăng tốc đồ họa cho cấu hình máy tính Identification Utility: -Lên Google search từ khóa:"intel® processor identification utility": -chọn phiên phù hợp với cấu hình máy tính tải cài đặt: -sau cài đặt phần mềm chạy Android Studio tiến hành cài máy ảo Emulator bình thường Bài 4:Hiển thị danh sách đối tượng ListView dùng Custom ArrayAdapter Bước 1: item xml: - Bước 2: Class Sach{} public class Sach implements Serializable { private int id; private String tenSach; private String giaSach; private String emailDangNhap; private int hinhAnh; } Bước 3: ArrayAdapter: public class SachAdapter extends ArrayAdapter { Activity context; int resource; public SachAdapter(@NonNull Activity context, int resource) { super(context, resource); this.context=context; this.resource=resource; } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { View customView=this.context.getLayoutInflater().inflate(this.res ource,null); TextView txtTenSach=(TextView)customView.findViewById(R.id.txtT enSach); TextView txtGiaSach=(TextView)customView.findViewById(R.id.txtGi aSach); ImageView imgHinhAnhSach=(ImageView)customView.findViewById( R.id.imgHinhAnhSach); Sach sach=getItem(position); txtTenSach.setText(sach.getTenSach()); txtGiaSach.setText(sach.getGiaSach()+"đồng"); imgHinhAnhSach.setImageResource(sach.getHinhAnh()); return customView; } } Bài 5: Giới thiệu menu NavigationBottom thường dùng App -Là loại Template thông dụng thường dùng nhiều ứng dụng khác -Trong Android Studio: File=>New=>New Project=> Bottom Navigation Activity: - Phiên menu Fragment: Đây UI menu Navigation Bottom Bài 6: Truy ền d ữ li ệu gi ữa Fragment menu Navigation Bottom Dùng EventBust: Vào trang chủ EventBust( http://greenrobot.org/eventbus/) để copy thư viện đọc cách sử dụng, dùng phiên 2.4: thư viện: implementation 'de.greenrobot:eventbus:2.4.0' Đối tượng truyền: SinhVien{ ptivate int id; private String name; private String phone; } +Truyền liệu: SinhVien sinhVien=new SinhVien(01,Quyen,098); EventBus.getDefault().postSticky(sinhVien); +Nhận liệu: Override hai hàm onStart() onStop(); @Override public void onStart() { super.onStart(); EventBus.getDefault().registerSticky(this); } @Override public void onStop() { super.onStop(); EventBus.getDefault().unregister(this); } // hàm dùng để nhận đối tượng truyền có kiểu SinhVien public void onEventMainThread(SinhVien event) { SinhVien sinhVienNhan=event; Bài 7: Điều hướng Fragment menu Navigation Bottom Điều hướng Fragment menu Navigation Bottom: - Tôi khai báo Button menu Fragment Home; Button btnChuyenSangNotify; btnChuyenSangNotify=findviewbyid(R.id.btnChuyenSang Notify); -Muốn nhấn vào button chuyển sang menu Fragment NoTifyCation làm sau: btnChuyenSangNotify.setOnClickListener(){ Navigation.findNavController(btnChuyenSangNotify).navig ate(R.id.navigation_notify); } đó, R.id.navigation_notify id menu navigation notify: Điều giúp thuận tiện VD: nhấn button đăng nhập chuyển sang menu mặt hàng Bài 9: Cách mở Activity từ Fragment đồ ng thời truyền liệu Cách 1:Dùng hàm getActivity để lấy Activity sau dùng hàm setContenView để mở layout Activity Class Sach{ private int id; private String name; private String gia; } Truyền đối tượng sach qua tham số vào hàm: moChiTiet(Sach sach){ getActivity.setContentView(R.layout.item); //Dùng getActivity để lấy Activity findViewbyId TextView txtId=getActivity().findViewbyId(R.id.txtId); TextView txName=getActivity().findViewbyId(R.id.txtName); TextView txtGia=getActivity().findViewbyId(R.id.txtGia); txtId.setText(sach.getId()); txtName.setText(sach.getName()); txtGia.setText(sach.getGia()); } Cách 2: Bước 1: mở Activity từ Fragment: Intent intent=new Intent(Fragment,Activity); startActivity(intent); Bước 2: Truyền liệu: Dùng EventBust Bài 9: Cách m m ột Activity t m ột Fragment đồ ng th ời truy ền d ữ li ệu Cách 1:Dùng hàm getActivity để lấy Activity sau dùng hàm setContenView để mở layout Activity Class Sach{ private int id; private String name; private String gia; } Truyền đối tượng sach qua tham số vào hàm: moChiTiet(Sach sach){ getActivity.setContentView(R.layout.item); //Dùng getActivity để lấy Activity findViewbyId TextView txtId=getActivity().findViewbyId(R.id.txtId); TextView txName=getActivity().findViewbyId(R.id.txtName); TextView txtGia=getActivity().findViewbyId(R.id.txtGia); txtId.setText(sach.getId()); txtName.setText(sach.getName()); txtGia.setText(sach.getGia()); } Cách 2: Bước 1: mở Activity từ Fragment: Intent intent=new Intent(Fragment,Activity); startActivity(intent); Bước 2: Truyền liệu: Dùng EventBust Bài 11: Mutiple Item RecyclerView, s d ụng m ột lúc nhi ều custom item RecyclerView Ta có xml item1, item2 Ta có Class sau: } // đối tượng có email email Đăng Nhập thêm vào danhSachUser if(!hangBayBan.getEmail().equals("emailDangNhap")) { ds1.add(hangBayBan); } } hangBayBans.clear(); hangBayBanAdapter.clear(); hangBayBans.addAll(ds1); hangBayBanAdapter.addAll(hangBayBans); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } Custom trainsation Fragment res/anima out_to_left public class MainActivity extends AppCompatActivity { BottomNavigationView navView; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); navView = findViewById(R.id.nav_view); // Passing each menu ID as a set of Ids because each // menu should be considered as top level destinations AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder( R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications, R.id.navigation_danhsach) build(); navView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { Fragment fragment; switch (menuItem.getItemId()){ case R.id.navigation_home: fragment = new HomeFragment(); loadFragment(fragment); return true; case R.id.navigation_dashboard: fragment = new DashboardFragment(); loadFragment(fragment); return true; case R.id.navigation_danhsach: fragment = new DanhSachFragment(); loadFragment(fragment); return true; case R.id.navigation_notifications: fragment = new NotificationsFragment(); loadFragment(fragment); return true; } return false; } }); } private void loadFragment(Fragment fragment) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.setCustomAnimations(R.anim.in_from_left,R.anim.out_to_right); transaction.replace(R.id.frame_container, fragment); transaction.addToBackStack(null); transaction.commit(); } } How to get Icon App to set to ImageView Ta khởi tạo Intent để chạy trình duyệt Chrome: Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.android.chrome"); startActivity(launchIntent); Ta lấy drawable App chạy phương thức getActivityIcon: ý phương thức static public static Drawable getActivityIcon(Context context, String packageName, String activityName) { PackageManager pm = context.getPackageManager(); Intent intent = new Intent(); intent.setComponent(new ComponentName(packageName, activityName)); ResolveInfo resolveInfo = pm.resolveActivity(intent, 0); return resolveInfo.loadIcon(pm); } Ta set hình ảnh vừa lấy lên ImageView: ImageView chromeIcon = (ImageView) findViewById(R.id.chromeButton); chromeIcon.setImageDrawable( MainActivity.getActivityIcon(this,"com.android.chrome", "com.google.android.apps.chrome.Main")); Custom View Components( developer.android.com) Custom View Components ( Tùy chỉnh wid get theo ý muốn) Bạn cần tạo lớp nghi đè phương thức lớp sẵn có Tạo lớp kiểm soát diện mạo chức VD: +núm điều khiển âm lượng tương tự điều khiển điện tử ta custom button thành + +nghi đè lên thành phần chìm Eddittext +các hiệu ứng nhấn button Mutiple Horizotal RecyclerView Item on RecyclerView or ListView Cách t ạo s ự ki ện OnClickListener cho RecyclerView Hoàn thành đề tài th ực t ập: thi ết k ế database App chat: Chat gi ữa Acount Họ tên: Vũ Xuân Trường Email: vutruong071994@gmail.com sdt: 0888573219 Đề tài : Thiết kế database App chat Các class; public class Ancount implements Serializable { private int id; private String email;// email đăng nhập tài khoản private String name; private ArrayListdsFriend=new ArrayList();//danh sách bạn bè private ArrayListStatuts=new ArrayList();// danh sách Status private ArrayListMesages=new ArrayList();// danh sách chat hai acount(acount đăng nhập acount danh sách bạn bè) } public class Message implements Serializable { private int id; private String emial1;// email đăng nhập private String email2;// email cần chat danh sách bạn bè private ArrayListdsNoiDung=new ArrayList();// nội dung chat email email } public class NoiDungChat implements Serializable { private String email; // email đăng nhập private String noiDung;// nội dung chat email đăng nhập private int id; } 2.Ta có sơ đồ database Firebase sau: "ChatFirebase" +Acout1 +id +email +name +dsFriend( ArrayListdsFiriend)// danh sách bạn bè danh sách gồm Acount khác +Message(ArrayListdsMesages)// danh sách gồm trò truyền Acount +Acount2: +id +email +name +dsFriend( ArrayListdsFiriend)// danh sách bạn bè danh sách gồm Acount khác +Message(ArrayListdsMesages)// danh sách gồm trò truyền Acount Cách thức chat Acount sử dụng sơ đồ Firebase Bước 1:Đầu tiên ta đăng nhập email đăng nhập để child() tới Acount cần đăng nhập Bước 2: Đọc mảng danh sách bạn bè Acount đăng nhập để hiển thị lên ListView Bước 3: Chọn Acount cần chat danh sách bạn bè ListView Bước 4: Chuyển sang hình chat hai Acount nhập nội dung chat Acount đăng nhập Chú ý: ta thêm trò chuyện Acount( tức giá trị Mesages) ta thêm lúc vào Ancount để đọc từ email hay email trò truyện khơng thay đổi databaseReference=firebaseDatabase.getReference().child("ChatFirebase") child(AcountFriend.getId()+"").child("Mesages")// AcountFriend.getId() ID Acount cần chat danh sách bạn bè, ta trỏ đến Acount danh sách Acount đưang nhập firebaseDatabase.getReference().child("ChatFirebase").child(DashboardFragment.selectio n+"").child("Mesages").setValue(NotificationsFragment.dsMesageTruyen); // DashboardFragment.selection Id Acount đăng nhập, ta trỏ đến Acount ta trỏ đến lúc vị trí Acount, nút Mesages Acount thêm giá trị Mesages để ta đọc nội dung chat từ Acount giống Coding, demo coding hình quan trọng 1.Màn hình Đăng kí Đăng Nhập hình đăng kí đăng nhập ta nhập emailDangNhap truyền sang hình danh sách bạn bè để đọc danh sách bạn bè Aconnt đăng nhập btnDangNhap.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { emailGui=edtEmail.getText().toString(); for (Ancount ac:dsAcount){ if(ac.getEmail().equals(emailGui)){ EventBus.getDefault().postSticky(ac); } } //nếu mật email chưa có hiển thị thông báo if (edtEmail.getText().toString().equals("") || edtMatKhauLan1.getText().toString().equals("")) { Toast.makeText(getContext(), "Điền đầy đủ thông tin!", Toast.LENGTH_LONG).show(); } else { firebaseAuth.signInWithEmailAndPassword(emailGui,edtMatKhauLan1.getText().toString()) addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { // đăng nhập thành công if (task.isSuccessful()) { // truyền email đăng nhập sang hình danh sách bạn bè thư viện EventBust EventBus.getDefault().postSticky(edtEmail.getText().toString() +""); Navigation.findNavController(btnDangNhap).navigate(R.id.navigation_dashboard); } else { Toast.makeText(getContext(), "Đăng nhập thất bại", Toast.LENGTH_LONG).show(); } } }); } } }); Màn Hình Danh Sách Bạn Bè hình danh sách bạn bè ta nhận emailTruyen child() tới danh sách bạn bè Acount đăng nhập sau đọc mảng danh sách hiển thị lên LisView @Override public void onStart() { super.onStart(); EventBus.getDefault().registerSticky(this); } @Override public void onStop() { super.onStop(); EventBus.getDefault().unregister(this); } // ta lấy Acount đăng nhập vừa truyền sau child đến danh sách bạn bè để đọc mảng hiển thị lên ListView public void onEventMainThread(Ancount event) { acount=event; selection=acount.getId(); DatabaseReference databaseReference1=databaseReference.child(acount.getId() +"").child("dsFriend"); databaseReference1.addValueEventListener(this); } @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { ArrayList ds1 = new ArrayList(); Iterable dataSnapshots = dataSnapshot.getChildren(); for (DataSnapshot dataSnapshot1 : dataSnapshots) { Ancount ac= dataSnapshot1.getValue(Ancount.class); ds1.add(ac); } acountAdapter.clear(); acountAdapter.addAll(ds1); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } // ta chọn người cần chat sau truyền Acount sang hình chat lvDanhSachBanBe.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Ancount ancount=acountAdapter.getItem(position); EventBus.getDefault().postSticky(ancount); Intent intent=new Intent(getContext(), ChatActivity.class); startActivity(intent); } }); Màn hình chat Acount ta child() tới nút trò chuyện( Mesages) Acount cần chat danh sách bạn bè( vừa truyền từ hình danh sách bạn bè) đồng thời child() tới trò truyện Acount đăng nhập, sau thêm Mesages( trò truyện Acount), ta đọc thêm nội dung chat vào Mesage Khi ta đọc trò truyện Acount, trỏ đến Acount đăng nhập hay Acout bạn bè nội dung giống Chú ý: Mesage1(){ id:1 email1:vutruong@gmail.com email2:duythanh@gmail.com dsNoiDungChat(ArrayList) } ta đăng nhập từ vutruong@gmail.com hay duythanh@gmail.com thêm trò truyện người, trò truyện chưa tồn thêm thêm thêm tiếp nội dung chat // so sánh email1( Acount đăng nhập) email2( Acount bạn bè) với emailSelection( email chọn đăng nhập) trùng Acount lấy trò chuyện hiển thị, thêm nội dung chat if((stt.getEmail2()==ancountSelection.getEmail()|| (stt.getEmial1()==ancountSelection.getEmail()))) { // id Mesages selection2 = stt.getId(); for (NoiDungChat noiDungChat : stt.getDsNoiDung()) { ds1.add(noiDungChat); } } } dsM.clear(); dsM.addAll(ds1); noiDungAdapter.clear(); noiDungAdapter.addAll(dsM); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } Chú ý: trò truyện id thứ tự mảng khác nhau, thêm vào Acount đăng nhập ta thêm theo thứ tự đọc firebase thêm vào Acount bạn bè ta phải truyền mảng Mesage Acount bạn bè sang hình thêm vào phần tử mảng Mesages( Acount đăng nhập) position duythanh vutruong position duythanh phamquy position duythanh va tranquang Mesages( Acount danh sách bạn bè) position vutruong va tranquang position vutruong va duythanh( position duythanh va vutruong) Tài liệu học android khóa học Google, khóa học Việt Nam, trang dạy lập trình tiếng VietNam EngLish Tài liệu EngLish học Android Google: https://developer.android.com/guide Các khóa học basic app Google:(java) https://developer.android.com/courses/fundamentals-training/overview-v2 Các trang dạy lập trình Việt Nam https://viblo.asia/tags/android https://o7planning.org/en/11007/android Các trang tiếng nước https://stackoverflow.com/ https://www.androidauthority.com/ developer.android.com Tài li ệu c Google https://developer.android.com/reference + Android Cơ nâng cao +All of Objects: Bao gồm tất lớp method thuộc tính Objects Android=> sử dụng hàm thuộc tính cần thiết đơi chút v ề database Firebase ! Ta biết SQL gồm bảng ràng buộc bảng, bảng có khóa khóa phụ để ràng buộc với bảng khác, Firebase tương tự SQL, khác phân theo cấp, có thuộc tính chung khóa phụ id khóa chính, Firebase khơng hỗ trợ hình ảnh SQLite hỗ trợ kiểu Bitmap nhiên phải khai báo Parcelable để thêm constructor cho Bitmap Trong ứng dụng thường có kiểu đối tượng hiển thị danh sách ListView, RecyclerView, thường có thêm đối tượng User để đăng nhập, loại mặt hàng kiểu đối tượng gồm thuộc tính khác Chỉ App quản lý thơng tin cần có nhiều đối tượng nhiều ràng buộc, App thơng thường khơng có q nhiều đối tượng cần hiển thị danh sách Các l ỗi th ường g ặp project Trình biên dịch Android có vị trí lỗi nên không cần giỏi EngLish để dich hết Error textion mà cần xem vị trí lỗi biến nào, hàm nào, class sau phán đốn để chỉnh sửa Nếu đốn khơng soi lại dòng code để tìm lỗi Các lỗi hệ thống bạn copy text error runtime sau paste vào Google, họ tìm kiếm StackoverFlow trang Việt Nam nước ngồi, ngồi youtube có fix lỗi Lỗi 1: thêm khoảng trống để chuyển int thành String Lỗi 2: không khởi tạo mảng =new ArrayList(); Lỗi 3: chưa return biến Lỗi 4: chưa thêm thư viện, ALT+Enter vào biến để import thư viện Lỗi 5: copy Adapter không thay item layout Lỗi 6: khơng đóng thẻ /> resource layout Lỗi 7: Lỗi n+1: thêm sau bận ! Mình thường viết App tầm trung nhỏ khoảng ngàn dòng nên soi hết, App lớn kiểu Zalo Shopee Unica App công ty bạn nên code xác khối lượng lớn khó tìm lỗi III.Chia sẻ source code số ứng dụng tự viết: Ứng dụng đọc truyện tranh: database SQLite, sử dụng kiểu hình ảnh Blob SQLite https://drive.google.com/file/d/1H2u27UdjeNb91DgtkeIg7X X4Kmuq1SnA/view?usp=sharing Ứng dụng từ điển: database SQLite, database từ điển Anh- Việt https://drive.google.com/file/d/1EGqz0tlWH8hB3JRPnMg5 MHb1Ir5E26eI/view?usp=sharing Ứng dụng bán hàng: Firebase: RealTime database, Storage, Notifycation, Autithencation https://drive.google.com/file/d/1lR0AB8FfbFvamjnuDmvYj Yt3Il_XwV6I/view?usp=sharing Ứng dụng chat nhóm online Firebase: https://drive.google.com/file/d/1lwMqxSXHQ712qigqcwW QhQR0I2roBmbQ/view?usp=sharing Ứng dụng học trực tuyến: dùng lưu trữ video Storage Firebase, hiển thị video avi lên VideoView: https://drive.google.com/file/d/12Ru_kfm2cnwVQmGVkfea VVnbwuQV3WJ-/view?usp=sharing Ứng dụng Rao vặt online Firebase: https://drive.google.com/file/d/1enRSAxaru0voY3VYb0oYm_50556MRQZ/view?usp=sharing Ứng dụng cửa hàng sách Firebase https://drive.google.com/file/d/1Quelar3V6qBw9YvGa4Zwk s4QeM4LHz3h/view?usp=sharing 8.UI ứng dụng bán smartphone: https://drive.google.com/file/d/1DOe3LzBFvreGRixqEfNBy HNeXvT4kXnF/view?usp=sharing Ứng dụng nghi ngày tháng năm SQLite: https://drive.google.com/file/d/1fv0c4YaoaEqH5rfXqSIZ4AI bwjXACgfM/view?usp=sharing 10.Ứng dụng cơng thức tốn THPT: https://drive.google.com/file/d/1fv0c4YaoaEqH5rfXqSIZ4AI bwjXACgfM/view?usp=sharing ... 16: Cách sử dụng Notifycation Firebase Muốn sử dụng Notifycation tất thư viện Autithencation, database, core, message phải phiên bản, lấy phiên 10.2.1: implementation 'com.google .firebase: firebase-auth:10.2.1'... dth="match_parent" android: layout_height="wrap_conte nt" android: text="TextView" android: textSize="26dp" />

Ngày đăng: 01/03/2020, 16:35

Mục lục

    Tổng hợp các kĩ thuật Android nâng cao

    tác giả:Vũ Xuân Trường

    Google Store: https://play.google.com/store/apps/dev?id=8951765077713242613

    Bài 1: Giới thiệu chung về Android

    2. Tại sao phải học Android?

    3. Những kiến thức căn bản để học Android

    Bài 2: Cách cài máy ảo chính thống Emulator của Android Studio

    Bước 2: Tải phần mềm hỗ trợ tăng tốc đồ họa cho cấu hình máy tính Identification Utility:

    Bài 4:Hiển thị danh sách đối tượng trên ListView dùng Custom ArrayAdapter

    Bài 5: Giới thiệu menu NavigationBottom thường dùng trong các App

Tài liệu cùng người dùng

Tài liệu liên quan