text:
Bạn cần tìm Freelancer hoặc công việc How to do graphic design with photoshop?
Cần giúp đỡ với How to do graphic design with photoshop? Thuê một freelancer ngay hôm nay! Bạn có chuyên về How to do graphic design with photoshop? không? Hãy sử dụng kĩ năng How to do graphic design with photoshop? của bạn và bắt đầu kiếm tiền trực tuyến ngay hôm nay! Freelancer là thị trường công việc lớn nhất trên thế giới. Hiện tại có 17.764 công việc đang đợi bạn đặt giá!Tôi Muốn Thuê Người Tôi Muốn Làm Việc
Công việc How to do graphic design with photoshop:
Thuê những Freelancer How to do graphic design with photoshop hàng đầu:
251
831
5
900
168

markdown:
# Bạn cần tìm Freelancer hoặc công việc How to do graphic design with photoshop?
Cần giúp đỡ với How to do graphic design with photoshop? Thuê một freelancer ngay hôm nay! Bạn có chuyên về How to do graphic design with photoshop? không? Hãy sử dụng kĩ năng How to do graphic design with photoshop? của bạn và bắt đầu kiếm tiền trực tuyến ngay hôm nay! Freelancer là thị trường công việc lớn nhất trên thế giới. Hiện tại có 17.764 công việc đang đợi bạn đặt giá!
[Tôi Muốn Thuê Người](/post-project) [Tôi Muốn Làm Việc](/signup) ![ ](https://www.f-cdn.com/assets/img/post-it-note-help-7078bd79.png)
### Công việc How to do graphic design with photoshop:
|Mã||Dự án/Cuộc thi||Mô tả||Lượt đặt giá/Bài dự thi||Kĩ năng||Bắt đầu||Kết thúc||Giá (USD)||loại hình|
|Dự án/Cuộc thi||Mô tả||Lượt đặt giá/Bài dự thi||Kĩ năng||Bắt đầu||Kết thúc||Giá (USD)|
|
|[Thiết kế trang web](https://www.vn.freelancer.com/jobs/website-design/), [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [Thiết kế Photoshop](https://www.vn.freelancer.com/jobs/photoshop-design/), [Thiết kế quảng cáo](https://www.vn.freelancer.com/jobs/advertisement-design/), [Brain Storming](https://www.vn.freelancer.com/jobs/brain-storming/) [German SEO Manager & Content Marketer](https://www.vn.freelancer.com/projects/articles/german-seo-manager-content-marketer/) [Tiếp thị qua Internet](https://www.vn.freelancer.com/jobs/internet-marketing/), [SEO](https://www.vn.freelancer.com/jobs/seo/), [Xây dựng liên kết](https://www.vn.freelancer.com/jobs/link-building/), [Tiếp thị](https://www.vn.freelancer.com/jobs/marketing/), [Article Writing](https://www.vn.freelancer.com/jobs/articles/) [Project for Germane I.](https://www.vn.freelancer.com/projects/graphic-design/project-for-germane-16916937/) [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [Thiết kế logo](https://www.vn.freelancer.com/jobs/logo-design/), [Photoshop](https://www.vn.freelancer.com/jobs/photoshop/), [Chỉnh sửa hình ảnh](https://www.vn.freelancer.com/jobs/photo-editing/), [Thiết kế quảng cáo](https://www.vn.freelancer.com/jobs/advertisement-design/), [Project for Seth J.](https://www.vn.freelancer.com/projects/graphic-design/project-for-seth-16916922/) [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [Thiết kế logo](https://www.vn.freelancer.com/jobs/logo-design/), [Photoshop](https://www.vn.freelancer.com/jobs/photoshop/), [Illustrator](https://www.vn.freelancer.com/jobs/illustrator/), [Thiết kế sách quảng cáo](https://www.vn.freelancer.com/jobs/brochure-design/), [Project for Rogelio B.](https://www.vn.freelancer.com/projects/graphic-design/project-for-rogelio-16916918/) [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [Thiết kế Banner](https://www.vn.freelancer.com/jobs/banner-design/), [Thiết kế logo](https://www.vn.freelancer.com/jobs/logo-design/), [Photoshop](https://www.vn.freelancer.com/jobs/photoshop/), [Illustrator](https://www.vn.freelancer.com/jobs/illustrator/), [Project for Morris Albert T.](https://www.vn.freelancer.com/projects/graphic-design/project-for-morris-albert-16916906/) [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [Thiết kế Banner](https://www.vn.freelancer.com/jobs/banner-design/), [Photoshop](https://www.vn.freelancer.com/jobs/photoshop/), [Thiết kế sách quảng cáo](https://www.vn.freelancer.com/jobs/brochure-design/), [Thiết kế quảng cáo](https://www.vn.freelancer.com/jobs/advertisement-design/), [Project for James Anthony M.](https://www.vn.freelancer.com/projects/graphic-design/project-for-james-anthony-16916856/) [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [Thiết kế logo](https://www.vn.freelancer.com/jobs/logo-design/), [Photoshop](https://www.vn.freelancer.com/jobs/photoshop/), [Thiết kế Photoshop](https://www.vn.freelancer.com/jobs/photoshop-design/), [,](https://www.vn.freelancer.com/jobs//) [Thiết kế sáng tạo](https://www.vn.freelancer.com/jobs/creative-design/) [I'm looking for a Graphic and UI/UX Designer Long-Term](https://www.vn.freelancer.com/projects/graphic-design/looking-for-graphic-designer-long-16608203/) [Thiết kế trang web](https://www.vn.freelancer.com/jobs/website-design/), [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [Thiết kế logo](https://www.vn.freelancer.com/jobs/logo-design/), [Photoshop](https://www.vn.freelancer.com/jobs/photoshop/), [Giao diện người dùng/IA](https://www.vn.freelancer.com/jobs/user-interface-ia/) [I'm looking for a Graphic and UI/UX Designer Long-Term](https://www.vn.freelancer.com/projects/graphic-design/looking-for-graphic-designer-long/) [Thiết kế trang web](https://www.vn.freelancer.com/jobs/website-design/), [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [Thiết kế logo](https://www.vn.freelancer.com/jobs/logo-design/), [Photoshop](https://www.vn.freelancer.com/jobs/photoshop/), [Giao diện người dùng/IA](https://www.vn.freelancer.com/jobs/user-interface-ia/) [I need a graphic artist. New Brand. Philosophy and Technology. I have all the imagery to pull from.](https://www.vn.freelancer.com/contest/i-need-a-graphic-artist-new-brand-philosophy-and-technology-i-have-all-the-imagery-to-pull-from-1287726.html) [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [Thiết kế logo](https://www.vn.freelancer.com/jobs/logo-design/), [Thiết kế trang web](https://www.vn.freelancer.com/jobs/website-design/) [Ecommerce Graphic Designer and Web Designer](https://www.vn.freelancer.com/projects/graphic-design/ecommerce-graphic-designer-web-designer/) [Thiết kế trang web](https://www.vn.freelancer.com/jobs/website-design/), [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [eCommerce](https://www.vn.freelancer.com/jobs/ecommerce/), [Dịch vụ trang web Amazon](https://www.vn.freelancer.com/jobs/amazon-web-services/), [HTML](https://www.vn.freelancer.com/jobs/html/) [Experienced eBook Graphic Designer for Long-Term Partnership](https://www.vn.freelancer.com/projects/graphic-design/experienced-ebook-graphic-designer-for/) [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [Thiết kế logo](https://www.vn.freelancer.com/jobs/logo-design/), [Photoshop](https://www.vn.freelancer.com/jobs/photoshop/), [Illustrator](https://www.vn.freelancer.com/jobs/illustrator/), [Adobe InDesign](https://www.vn.freelancer.com/jobs/indesign/) [Help with weekly art/graphic design work](https://www.vn.freelancer.com/projects/logo-design/help-with-weekly-art-graphic/) [Thiết kế logo](https://www.vn.freelancer.com/jobs/logo-design/), [Photoshop](https://www.vn.freelancer.com/jobs/photoshop/), [Illustrator](https://www.vn.freelancer.com/jobs/illustrator/), [Minh họa](https://www.vn.freelancer.com/jobs/illustration/), [T-Shirts](https://www.vn.freelancer.com/jobs/tshirts/) [Graphic Design Work](https://www.vn.freelancer.com/projects/graphic-design/graphic-design-work-16305358/) [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [Photoshop](https://www.vn.freelancer.com/jobs/photoshop/), [Illustrator](https://www.vn.freelancer.com/jobs/illustrator/), [Adobe InDesign](https://www.vn.freelancer.com/jobs/indesign/), [Thiết kế sách quảng cáo](https://www.vn.freelancer.com/jobs/brochure-design/) [Graphics for a crowd funding campaign](https://www.vn.freelancer.com/projects/graphic-design/graphics-for-crowd-funding-campaign/) [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [Photoshop](https://www.vn.freelancer.com/jobs/photoshop/), [Illustrator](https://www.vn.freelancer.com/jobs/illustrator/), [Thiết kế Photoshop](https://www.vn.freelancer.com/jobs/photoshop-design/), [Bất kì công việc gì](https://www.vn.freelancer.com/jobs/anything-goes/) [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [UX Design](https://www.vn.freelancer.com/jobs/user-experience-design/), [Giao diện người dùng/IA](https://www.vn.freelancer.com/jobs/user-interface-ia/), [User Interface Design](https://www.vn.freelancer.com/jobs/ui-design/) [Create Visual Campaign for Freelancer.com Brand](https://www.vn.freelancer.com/contest/create-visual-campaign-for-freelancercom-brand-1244821.html) [Adobe Illustrator](https://www.vn.freelancer.com/jobs/adobe-illustrator/), [Thiết kế quảng cáo](https://www.vn.freelancer.com/jobs/advertisement-design/), [After Effects](https://www.vn.freelancer.com/jobs/after-effects/), [Sản xuất hoạt họa](https://www.vn.freelancer.com/jobs/animation/), [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/) [Design project](https://www.vn.freelancer.com/projects/graphic-design/design-project-16062540/) [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/) [Responsive website with e-commerce is](https://www.vn.freelancer.com/projects/php/responsive-website-with-commerce/) [PHP](https://www.vn.freelancer.com/jobs/php/), [Thiết kế trang web](https://www.vn.freelancer.com/jobs/website-design/), [WordPress](https://www.vn.freelancer.com/jobs/wordpress/), [HTML5](https://www.vn.freelancer.com/jobs/html-five/), [HTML](https://www.vn.freelancer.com/jobs/html/) [graphic designer and data entery](https://www.vn.freelancer.com/projects/graphic-design/graphic-designer-data-entery/) [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [Quản trị hệ thống](https://www.vn.freelancer.com/jobs/system-admin/), [Photoshop](https://www.vn.freelancer.com/jobs/photoshop/), [Computer Science](https://www.vn.freelancer.com/jobs/computer-science/)
Showing 1 to 20 of 628 entries
### Thuê những Freelancer How to do graphic design with photoshop hàng đầu:
![ manager2015 - United States](https://cdn5.f-cdn.com/ppic/109720663/logo/14562522/AU0o7%2Fprofile_logo_.png)
251
![ eClickApps - India](https://cdn5.f-cdn.com/ppic/57007314/logo/2681817/BhIrQ%2Fprofile_logo_.gif)
831
![ bigworksDS - India](https://cdn6.f-cdn.com/ppic/83612031/logo/20393369/QLzAl%2Fprofile_logo_.png)
5
![ ITYPETech - India](https://cdn2.f-cdn.com/ppic/109764191/logo/17134689/4T1D8%2Fprofile_logo_.png)
900
![ hemabajaj891 - India](https://cdn2.f-cdn.com/ppic/69291463/logo/13004910/tEUQm%2Fprofile_logo_.jpg)
168
### Các việc làm tương tự khác:
[how to do graphic design for free](/job-search/how-to-do-graphic-design-for-free/), [how to create graphic design](/job-search/how-to-create-graphic-design/), [graphic design with photoshop](/job-search/graphic-design-with-photoshop/), [how to selling graphic design](/job-search/how-to-selling-graphic-design/), [how to price graphic design work](/job-search/how-to-price-graphic-design-work/), [how to get graphic design work](/job-search/how-to-get-graphic-design-work/), [how to do website design](/job-search/how-to-do-website-design/), [how to do logo design online](/job-search/how-to-do-logo-design-online/), [how to do graphic design from home](/job-search/how-to-do-graphic-design-from-home/), [how to do graphic](/job-search/how-to-do-graphic/), [how to buy graphic design](/job-search/how-to-buy-graphic-design/), [how to start graphic design business](/job-search/how-to-start-graphic-design-business/), [how to sell graphic design work](/job-search/how-to-sell-graphic-design-work/), [how to make graphic design portfolio](/job-search/how-to-make-graphic-design-portfolio/), [how to find graphic design work](/job-search/how-to-find-graphic-design-work/), [how to do web design online job](/job-search/how-to-do-web-design-online-job/), [how to do graphic design free](/job-search/how-to-do-graphic-design-free/), [how to create graphic design for mobile](/job-search/how-to-create-graphic-design-for-mobile/), [how to be graphic design](/job-search/how-to-be-graphic-design/), [how to start graphic design](/job-search/how-to-start-graphic-design/), [how to sale graphic design](/job-search/how-to-sale-graphic-design/), [how to draw graphic design](/job-search/how-to-draw-graphic-design/), [how to do online job with freelancer](/job-search/how-to-do-online-job-with-freelancer/), [learn how to do graphic design](/job-search/learn-how-to-do-graphic-design/), [how to do graphic design online free](/job-search/how-to-do-graphic-design-online-free/), [how to do graphic design on a computer](/job-search/how-to-do-graphic-design-on-a-computer/), [how to do graphic design online for money](/job-search/how-to-do-graphic-design-online-for-money/), [how to do graphic design on a mac](/job-search/how-to-do-graphic-design-on-a-mac/), [how to learn graphic design in photoshop](/job-search/how-to-learn-graphic-design-in-photoshop/), [how to do graphic design on a computer for free](/job-search/how-to-do-graphic-design-on-a-computer-for-free/), [Thuê ngoài How to do graphic design with photoshop](/work/how-to-do-graphic-design-with-photoshop/)

X-Cache: HIT


text:
Bạn cần tìm công việc hoặc người trong lĩnh vực Php dynamic link?
Cần giúp đỡ với Php dynamic link? Thuê một freelancer ngay hôm nay! Bạn có chuyên về Php dynamic link? không? Hãy sử dụng kĩ năng Php dynamic link? của bạn và bắt đầu kiếm tiền trực tuyến ngay hôm nay! Freelancer là thị trường công việc lớn nhất trên thế giới. Hiện tại có 17.764 công việc đang đợi bạn đặt giá!Tôi Muốn Thuê Người Tôi Muốn Làm Việc
Công việc Php dynamic link:
Thuê những Freelancer Php dynamic link hàng đầu:
207
251
30
525
211

markdown:
# Bạn cần tìm công việc hoặc người trong lĩnh vực Php dynamic link?
Cần giúp đỡ với Php dynamic link? Thuê một freelancer ngay hôm nay! Bạn có chuyên về Php dynamic link? không? Hãy sử dụng kĩ năng Php dynamic link? của bạn và bắt đầu kiếm tiền trực tuyến ngay hôm nay! Freelancer là thị trường công việc lớn nhất trên thế giới. Hiện tại có 17.764 công việc đang đợi bạn đặt giá!
[Tôi Muốn Thuê Người](/post-project) [Tôi Muốn Làm Việc](/signup) ![ ](https://www.f-cdn.com/assets/img/post-it-note-help-7078bd79.png)
### Công việc Php dynamic link:
|Mã||Dự án/Cuộc thi||Mô tả||Lượt đặt giá/Bài dự thi||Kĩ năng||Bắt đầu||Kết thúc||Giá (USD)||loại hình|
|Dự án/Cuộc thi||Mô tả||Lượt đặt giá/Bài dự thi||Kĩ năng||Bắt đầu||Kết thúc||Giá (USD)|
|
|[Quản trị hệ thống](https://www.vn.freelancer.com/jobs/system-admin/), [Cisco](https://www.vn.freelancer.com/jobs/cisco/), [Quản trị mạng](https://www.vn.freelancer.com/jobs/network-administration/) [Javascript page fixed](https://www.vn.freelancer.com/projects/php/javascript-page-fixed/) [PHP](https://www.vn.freelancer.com/jobs/php/), [Javascript](https://www.vn.freelancer.com/jobs/javascript/), [CSS](https://www.vn.freelancer.com/jobs/css/), [HTML5](https://www.vn.freelancer.com/jobs/html-five/), [HTML](https://www.vn.freelancer.com/jobs/html/) [Scraping and Excel dynamic updating](https://www.vn.freelancer.com/projects/php/scraping-excel-dynamic-updating/) [PHP](https://www.vn.freelancer.com/jobs/php/), [Nhập liệu](https://www.vn.freelancer.com/jobs/data-entry/), [Excel](https://www.vn.freelancer.com/jobs/excel/), [Web Scraping](https://www.vn.freelancer.com/jobs/web-scraping/), [Khai thác dữ liệu](https://www.vn.freelancer.com/jobs/data-mining/) [Link task sheet with annual wall calendar](https://www.vn.freelancer.com/projects/excel/link-task-sheet-with-annual/) [Excel](https://www.vn.freelancer.com/jobs/excel/) [Build a website](https://www.vn.freelancer.com/projects/graphic-design/build-website-17193161/) [PHP](https://www.vn.freelancer.com/jobs/php/), [Thiết kế trang web](https://www.vn.freelancer.com/jobs/website-design/), [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [WordPress](https://www.vn.freelancer.com/jobs/wordpress/), [HTML](https://www.vn.freelancer.com/jobs/html/) [build a dynamic form](https://www.vn.freelancer.com/projects/javascript/build-dynamic-form/) [Javascript](https://www.vn.freelancer.com/jobs/javascript/), [Python](https://www.vn.freelancer.com/jobs/python/), [Programming](https://www.vn.freelancer.com/jobs/programming/), [Web Development](https://www.vn.freelancer.com/jobs/web-development/) [Need the best link building package to show MOVEMENT Off pag seo only.](https://www.vn.freelancer.com/projects/wordpress/need-the-best-link-building/) [Tiếp thị qua Internet](https://www.vn.freelancer.com/jobs/internet-marketing/), [SEO](https://www.vn.freelancer.com/jobs/seo/), [Xây dựng liên kết](https://www.vn.freelancer.com/jobs/link-building/), [WordPress](https://www.vn.freelancer.com/jobs/wordpress/), [Tiếp thị](https://www.vn.freelancer.com/jobs/marketing/) [OFF PAGE SEO OPTIMISATION - LINK BUILDING STRATEGY + IMPLEMENTATION](https://www.vn.freelancer.com/projects/internet-marketing/off-page-seo-optimisation-link/) [Tiếp thị qua Internet](https://www.vn.freelancer.com/jobs/internet-marketing/), [SEO](https://www.vn.freelancer.com/jobs/seo/), [Xây dựng liên kết](https://www.vn.freelancer.com/jobs/link-building/), [Tiếp thị](https://www.vn.freelancer.com/jobs/marketing/), [Search Engine Marketing](https://www.vn.freelancer.com/jobs/search-engine-marketing/) [Link Building](https://www.vn.freelancer.com/projects/internet-marketing/link-building-17186416/) [Tiếp thị qua Internet](https://www.vn.freelancer.com/jobs/internet-marketing/), [SEO](https://www.vn.freelancer.com/jobs/seo/), [Xây dựng liên kết](https://www.vn.freelancer.com/jobs/link-building/), [Tiếp thị](https://www.vn.freelancer.com/jobs/marketing/) [Design Logo](https://www.vn.freelancer.com/contest/design-logo-1351010.html) [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [Thiết kế logo](https://www.vn.freelancer.com/jobs/logo-design/) [I want to seo link builder](https://www.vn.freelancer.com/projects/link-building/want-seo-link-builder/) [Xây dựng liên kết](https://www.vn.freelancer.com/jobs/link-building/) [referral link](https://www.vn.freelancer.com/projects/php/referral-link/) [PHP](https://www.vn.freelancer.com/jobs/php/), [Tiếp thị qua Internet](https://www.vn.freelancer.com/jobs/internet-marketing/), [SEO](https://www.vn.freelancer.com/jobs/seo/), [Xây dựng liên kết](https://www.vn.freelancer.com/jobs/link-building/), [Tiếp thị](https://www.vn.freelancer.com/jobs/marketing/) [Need a dynamic website with admin tool](https://www.vn.freelancer.com/projects/php/need-dynamic-website-with-admin/) [PHP](https://www.vn.freelancer.com/jobs/php/), [CSS](https://www.vn.freelancer.com/jobs/css/), [Codeigniter](https://www.vn.freelancer.com/jobs/codeigniter/), [MySQL](https://www.vn.freelancer.com/jobs/mysql/), [HTML](https://www.vn.freelancer.com/jobs/html/) [6 pages dynamic website - 04/06/2018 12:37 EDT](https://www.vn.freelancer.com/projects/graphic-design/pages-dynamic-website-edt/) [PHP](https://www.vn.freelancer.com/jobs/php/), [Thiết kế trang web](https://www.vn.freelancer.com/jobs/website-design/), [Thiết kế đồ họa](https://www.vn.freelancer.com/jobs/graphic-design/), [SEO](https://www.vn.freelancer.com/jobs/seo/), [HTML](https://www.vn.freelancer.com/jobs/html/) [Dynamic Web banner based on location](https://www.vn.freelancer.com/projects/html/dynamic-web-banner-based-location/) [CSS](https://www.vn.freelancer.com/jobs/css/), [HTML5](https://www.vn.freelancer.com/jobs/html-five/), [HTML](https://www.vn.freelancer.com/jobs/html/), [CSS3](https://www.vn.freelancer.com/jobs/css-three/) [Need to develop n Level category and dynamic megamenu](https://www.vn.freelancer.com/projects/php/need-develop-level-category-dynamic/) [PHP](https://www.vn.freelancer.com/jobs/php/), [CSS](https://www.vn.freelancer.com/jobs/css/), [Codeigniter](https://www.vn.freelancer.com/jobs/codeigniter/) [Banner đưa đến link nội dung: https://forexprocenter.com/tin-tuc/mo-tai-khoan-weltrade-nhanh.html key nội dung của đích nội dung và key nội dung banner ” hỗ trợ mở tài khoản weltrade để giao dịch đầu tư tài chính ” - 15/06/2018 00:47 EDT](https://www.vn.freelancer.com/projects/banner-design/banner-link-dung-https-forexprocenter/) [Thiết kế Banner](https://www.vn.freelancer.com/jobs/banner-design/) [I NEED A ECOMMERCE DEVELOPMENT](https://www.vn.freelancer.com/projects/php/need-ecommerce-development/) [PHP](https://www.vn.freelancer.com/jobs/php/), [Javascript](https://www.vn.freelancer.com/jobs/javascript/), [Thiết kế trang web](https://www.vn.freelancer.com/jobs/website-design/), [WordPress](https://www.vn.freelancer.com/jobs/wordpress/), [HTML](https://www.vn.freelancer.com/jobs/html/) [Dynamic Survey Application](https://www.vn.freelancer.com/projects/php/dynamic-survey-application/) [PHP](https://www.vn.freelancer.com/jobs/php/), [CakePHP](https://www.vn.freelancer.com/jobs/cakephp/), [Laravel](https://www.vn.freelancer.com/jobs/laravel/) [Add dynamic onesignal to iOS & Android app from plain PHP backoffice](https://www.vn.freelancer.com/projects/php/add-dynamic-onesignal-ios-android/) [PHP](https://www.vn.freelancer.com/jobs/php/), [Mobile App Development](https://www.vn.freelancer.com/jobs/mobile-phone/), [iPhone](https://www.vn.freelancer.com/jobs/iphone/), [Android](https://www.vn.freelancer.com/jobs/android/), [PhoneGap](https://www.vn.freelancer.com/jobs/phonegap/)
Showing 1 to 20 of 24 entries
### Thuê những Freelancer Php dynamic link hàng đầu:
![ Torricelli - Venezuela](https://cdn5.f-cdn.com/ppic/56865888/logo/1738999/2HmO5%2Fprofile_logo_.jpg)
207
![ manager2015 - United States](https://cdn5.f-cdn.com/ppic/109720663/logo/14562522/AU0o7%2Fprofile_logo_.png)
251
![ AhteshamAK - Pakistan](https://cdn5.f-cdn.com/ppic/86331655/logo/24217438/HtTKs%2Fprofile_logo_.png)
30
![ hardikmemagara - India](https://cdn2.f-cdn.com/ppic/57880979/logo/9036311/Po5rQ%2Fprofile_logo_.png)
525
![ Angel521 - China](https://cdn6.f-cdn.com/ppic/115133014/logo/21653473/F2sZo%2Fprofile_logo_.jpg)
211
### Các việc làm tương tự khác:
[php dynamic grid](/work/php-dynamic-grid/), [web design in india php dynamic](/work/web-design-in-india-php-dynamic/), [php dynamic website templates free download](/work/php-dynamic-website-templates-free-download/), [php dynamic form](/work/php-dynamic-form/), [php dynamic forms](/work/php-dynamic-forms/), [php expiring link](/work/php-expiring-link/), [php dynamic order form](/work/php-dynamic-order-form/), [php dynamic pdf](/work/php-dynamic-pdf/), [PHP dynamic](/work/PHP-dynamic/), [php dynamic subdomain](/work/php-dynamic-subdomain/), [php expire link](/work/php-expire-link/), [php dynamic drop menu](/work/php-dynamic-drop-menu/), [php dynamic image](/work/php-dynamic-image/), [javascript php dynamic form](/work/javascript-php-dynamic-form/), [php dynamic class](/work/php-dynamic-class/), [php dynamic meta tags](/work/php-dynamic-meta-tags/), [php dynamic title](/work/php-dynamic-title/), [php dynamic page creation](/work/php-dynamic-page-creation/), [php convert link](/work/php-convert-link/), [php dynamic mvc directory structure](/work/php-dynamic-mvc-directory-structure/), [php dynamic meta](/work/php-dynamic-meta/), [php dynamic timeline](/work/php-dynamic-timeline/), [php sef link](/work/php-sef-link/), [send dynamic link email php](/work/send-dynamic-link-email-php/), [remove php dynamic link](/work/remove-php-dynamic-link/), [slideshow link php dynamic](/work/slideshow-link-php-dynamic/), [keep focus dynamic link php](/work/keep-focus-dynamic-link-php/), [php dynamic inclusion link](/work/php-dynamic-inclusion-link/), [dynamic link php sql database](/work/dynamic-link-php-sql-database/), [dynamic link check php](/work/dynamic-link-check-php/), [freelancer Php dynamic link](/job-search/php-dynamic-link/)

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Identified-Payload-Type: text/html

X-Cache: MISS

Server: nginx

Connection: close

Accept-Ranges: bytes

X-Frame-Options: SAMEORIGIN

Cache-Control: public, max-age=180, s-maxage=3600

Vary: Accept-Encoding, X-Authenticated

Content-Type: text/html; charset=UTF-8


text:
Tất cả sẽ chỉ là lý thuyết cho đến khi bạn đang thực sự tìm hiểu một cách nghiêm túc. Và sau đó, bạn sẽ tìm ra những ranh giới hoặc bài học để bảo vệ bản thân.
Cũng có thể nói rằng, vì nước Việt Nam vẫn chưa hoàn toàn nhìn thoáng trong việc giáo dục giới tính cho lớp trẻ đã gây ra những trường hợp dở khóc dở cười. Trong khi các nước khác coi tình dục là một vấn đề cần được quan tâm. Những việc cần được tuyên truyền rộng rãi xoay quanh SEX như các câu hỏi về tình dục mà lớp trẻ muốn biết, sự ảnh hưởng của phim khiêu dâm, các thông tin về tình dục an toàn hay các vấn đề về thuốc tránh thai, thuốc kháng sinh…không hề được phổ biến ở nước ta. Nói thẳng ra dù sớm hay muộn, phụ nữ chúng ta đều phải trải qua mối quan hệ tình dục. Cho nên việc tìm hiểu kiến thức về SEX rất cần thiết. Sau đây là 18 điều mà những phụ nữ đã trải qua mối quan hệ một cách nghiêm túc muốn chia sẻ cho chúng ta ( theo báo Reddit- Mỹ )
1. Không có định nghĩa cho việc “sạch sẽ” khi đang quan hệ tình dục. Nhưng bạn cần làm sạch cơ thể ngay sau đó.
2. Đàn ông không phải lúc nào cũng có ham muốn cao hơn phụ nữ.
3. Bạn có thể có nhiều MỐI quan hệ tình dục nhưng NGƯỜI bạn thực sự muốn quan hệ thì chỉ có 1.
4. Tình dục sẽ rất tuyệt vời khi bạn được trải qua với người mình yêu.
5. Phụ nữ cũng được phép thưởng thức mối quan hệ tình dục như nam giới.
6. Quan hệ tình dục chắc chắn sẽ không giống như các bộ phim khiêu dâm. ( Tất nhiên vì nó chỉ là phim )
7. Bạn sẽ có giá trị nếu nói không với mối quan hệ tình dục bất chính.
8. Áp đặt những lý thuyết tình dục lên người bạn yêu thì thật là không công bằng.
9. Sẽ bình thường thôi nếu bạn nói “Không” với tình dục khi bạn không muốn.
10. Mối quan hệ tình dục dù nghiêm túc hay không đều là sự cho đi và nhận lại.
11. Rất nhiều phụ nữ không thể đạt cực khoái khi giao hợp một mình. Ước tính có khoảng 50 – 75% phụ nữ cần sự kích thích từ bên ngoài.
12. Nếu bạn có kế hoạch bảo vệ mình thì thật dễ dàng để bắt kịp nhịp độ trong khi yêu.
13. Tình dục “mạnh” không có nghĩ “tình yêu” lớn.
14. Nỗi lo lắng và sợ hãi về tình dục là hoàn toàn bình thường. Thật tốt nếu có thể trao đổi nhiều hơn về vấn đề này.
15. Cũng giống như bất kỳ điều gì khác, sẽ tốt hơn nếu bạn thực hành. Quan hệ tình dục không phải là điều bạn sinh ra đã biết làm thế nào là tốt.
16. Nếu đó là lần đầu tiên, sẽ rất bối rối đấy.
17. “Đỉnh cao của tình dục” không nhất thiết phải thực hiện ở tuổi đôi mươi.
18. Thử nghiệm! ( Nghiêm túc nhé)
Theo Kinh Doanh và Pháp Luật
Bài viết cùng chuyên mục Mẹo Vặt:
Đăng nhận xét

markdown:
Tất cả sẽ chỉ là lý thuyết cho đến khi bạn đang thực sự tìm hiểu một cách nghiêm túc. Và sau đó, bạn sẽ tìm ra những ranh giới hoặc bài học để bảo vệ bản thân.
Cũng có thể nói rằng, vì nước Việt Nam vẫn chưa hoàn toàn nhìn thoáng trong việc giáo dục giới tính cho lớp trẻ đã gây ra những trường hợp dở khóc dở cười. Trong khi các nước khác coi tình dục là một vấn đề cần được quan tâm. Những việc cần được tuyên truyền rộng rãi xoay quanh SEX như các câu hỏi về tình dục mà lớp trẻ muốn biết, sự ảnh hưởng của phim khiêu dâm, các thông tin về tình dục an toàn hay các vấn đề về thuốc tránh thai, thuốc kháng sinh…không hề được phổ biến ở nước ta. Nói thẳng ra dù sớm hay muộn, phụ nữ chúng ta đều phải trải qua mối quan hệ tình dục. Cho nên việc tìm hiểu kiến thức về SEX rất cần thiết. Sau đây là 18 điều mà những phụ nữ đã trải qua mối quan hệ một cách nghiêm túc muốn chia sẻ cho chúng ta ( theo báo Reddit- Mỹ )
1. Không có định nghĩa cho việc “sạch sẽ” khi đang quan hệ tình dục. Nhưng bạn cần làm sạch cơ thể ngay sau đó.
2. Đàn ông không phải lúc nào cũng có ham muốn cao hơn phụ nữ.
3. Bạn có thể có nhiều MỐI quan hệ tình dục nhưng NGƯỜI bạn thực sự muốn quan hệ thì chỉ có 1.
4. Tình dục sẽ rất tuyệt vời khi bạn được trải qua với người mình yêu.
5. Phụ nữ cũng được phép thưởng thức mối quan hệ tình dục như nam giới.
6. Quan hệ tình dục chắc chắn sẽ không giống như các bộ phim khiêu dâm. ( Tất nhiên vì nó chỉ là phim )
7. Bạn sẽ có giá trị nếu nói không với mối quan hệ tình dục bất chính.
8. Áp đặt những lý thuyết tình dục lên người bạn yêu thì thật là không công bằng.
9. Sẽ bình thường thôi nếu bạn nói “Không” với tình dục khi bạn không muốn.
10. Mối quan hệ tình dục dù nghiêm túc hay không đều là sự cho đi và nhận lại.
![ ](https://lh4.googleusercontent.com/proxy/CmKbL5IkGBIRzUSvnqRalRVkWyN1YjWDNXZb1FJvhcRc9XpK-fj8n7IqJgxHhnLxPy7MaX44xLuTImPagLipaGxCx4jVcVJ2moGgKcHgI0zntFagyv9Y3eK_UVbXW8neser4CHmCorB7lIjZug=s0-d)
11. Rất nhiều phụ nữ không thể đạt cực khoái khi giao hợp một mình. Ước tính có khoảng 50 – 75% phụ nữ cần sự kích thích từ bên ngoài.
12. Nếu bạn có kế hoạch bảo vệ mình thì thật dễ dàng để bắt kịp nhịp độ trong khi yêu.
13. Tình dục “mạnh” không có nghĩ “tình yêu” lớn.
14. Nỗi lo lắng và sợ hãi về tình dục là hoàn toàn bình thường. Thật tốt nếu có thể trao đổi nhiều hơn về vấn đề này.
15. Cũng giống như bất kỳ điều gì khác, sẽ tốt hơn nếu bạn thực hành. Quan hệ tình dục không phải là điều bạn sinh ra đã biết làm thế nào là tốt.
16. Nếu đó là lần đầu tiên, sẽ rất bối rối đấy.
17. “Đỉnh cao của tình dục” không nhất thiết phải thực hiện ở tuổi đôi mươi.
18. Thử nghiệm! ( Nghiêm túc nhé)
Theo Kinh Doanh và Pháp Luật
**Bài viết cùng chuyên mục** [Mẹo Vặt](http://www.seoer.com.vn/search/label/Meo-vat):
## Đăng nhận xét

WARC-Identified-Payload-Type: application/xhtml+xml

Server: GSE

X-Content-Type-Options: nosniff

X-Robots-Tag: all

Cache-Control: private, max-age=0

X-XSS-Protection: 1; mode=block


text:
Danh thủ bóng đá Roberto Carlos đang tỏ ra phân vân không biết có nên chia tay với câu lạc bộ lừng danh Real Madrid vào cuối mùa giải này để về đầu quân cho Fenerbahce của Thổ Nhĩ Kỳ hay không.
Hậu vệ 34 tuổi người Brazil này đã đạt được rất nhiều thành công kể từ khi anh chuyển từ Inter Milan của Ý sang Real Madrid vào năm 1996.
Hôm thứ tư vừa qua, Carlos nói rằng anh không vui lắm nếu không gia hạn hợp đồng được với Real Madrid, tuy nhiêu đó lại là cơ hội để anh chuyển sang thử tài tại một câu lạc bộ khác đang cần anh.
Carlos nói rằng: “Ðề nghị của Fenerbahce làm cho tôi cảm thấy mình có giá trị trở lại.” Carlos cho biết câu lạc bộ Thổ Nhĩ Kỳ này đồng ý những điều kiện hợp đồng mà anh đang thương lượng với với Real Madrid.
Trong trận tiếp Real Mallorca vào chủ nhật tới đây trên sân nhà, nếu Real Madrid giành được chiến thắng thì họ sẽ đoạt luôn chức vô địch giải ngoại hạng Tây Ban Nha mùa giải này.
Trước trận đấu này, Carlos nói rằng anh rất mong muốn mang về cho người hâm mộ chiếc cúp vô địch, để khi chia tay với câu lạc bộ vào cuối mùa giải này, anh vẫn có thể “đi trong tư thế ngẩng cao đầu.”

X-UA-Compatible: IE=edge

Cache-Control: public, max-age=283

Vary: Accept-Encoding

Content-Language: vi

Content-Type: text/html; charset=utf-8


markdown:
Israel gia hạn cuộc ngưng bắn ngày thứ Bảy thêm 24 giờ đồng hồ nữa, đến nửa đêm ngày Chủ Nhật, giờ địa phương.
Một viên chức Israel nói Liên Hiệp Quốc yêu cầu gia hạn 12 giờ ngưng bắn và nội các Israel đã đồng ý.
Viên chức này nói Israel sẽ giáng trả nếu Hamas bắn rocket trong thời gian gia hạn và sẽ tiếp tục truy tìm và phá hủy các đường hầm Hamas dùng để chuyển vũ khí và chiến binh.
Hamas chưa quyết định cũng sẽ gia hạn ngưng bắn hay không.
Các phần tử chủ chiến Hamas đã bắn ít nhất 3 quả rocket vào Israel sau khi 12 giờ ngưng chiến chấm dứt. Quân đội Israel không đánh trả lại.
Cuộc ngưng bắn tạm thời ngày thứ Bảy đã giúp cư dân Gaza cơ hội trở về nhà để xem có gì còn lại hay không sau gần 3 tuần lễ oanh kích của Israel để đáp trả việc Hamas bắn rốckết vào nước này.
Một số người có thể thu nhặt được một ít vật dụng trong khi người khác đứng nhìn nhà cửa bị phá hủy.
Số người Palestine thiệt mạng đã vượt quá 1.000 người, hầu hết là thường dân trong đó có nhiều trẻ em. Có ít nhất 40 binh sĩ và hai thường dân Israel thiệt mạng trong các cuộc giao tranh.
Bảy Bộ trưởng ngoại giao trong đó có Ngoại trưởng Mỹ John Kerry đã nhóm họp vào ngày thứ Bảy ở Paris trong nỗ lực không ngưng nghỉ nhằm chấm dứt các cuộc giao tranh.
Sau cuộc họp, Ngoại trưởng Pháp Laurent Fabius nói các nhà ngoại giao đang hô hào cho một cuộc ngưng bắn lâu dài, trong đó các mối quan tâm về an ninh của Israel được thỏa mãn, đồng thời tìm cách đáp ứng những đòi hỏi của người Palestine liên quan tới sự phát triển kinh tế của Gaza.
Israel muốn phi quân sự hóa dải Gaza. Israel nói có quyền bảo vệ người dân tránh khỏi những vụ bắn rocket của các phần tử khủng bố từ chối công nhận sự hiện hữu của Israel.
Người Palestine muốn Israel và Ai Cập chấm dứt phong tỏa Gaza, vốn đã bóp nghẹt nền kinh tế tại đây và không cho người Palestine đi ra bên ngoài.
[](/a/4446420.html)

Cache-Control: public, max-age=271


text: Yêu cầu: – Có kinh nghiệm Sales/ Marketing – Giao tiếp thành thạo Tiếng Anh và mức khá Tiếng Hàn – Ưu tiên visa F Hồ sơ xin vui lòng gửi về : hr@gmeremit.com 🎯WHO ARE WE? Công ty tài chính đầu tiên được Chính phủ Hàn Quốc cấp phép chuyển tiền đa quốc gia…

Server: Apache

Vary: Cookie,Accept-Encoding


text:
Nội dung bài viết
- FrameLayout – Đơn Giản Nhưng Ít Dùng
- LinearLayout – Sắp Xếp Các View Nằm Cạnh Nhau
- RelativeLayout – Sắp Xếp Các View Theo Mối Quan Hệ
- TableLayout – Nghe Tên Là Biết Sẽ Liên Quan Đến Bảng
Được chỉnh sửa ngày 9/11/2017.
Chào mừng các bạn đến với bài viết bổ sung cho kiến thức còn khuyết của Bài 10. Nói là khuyết nhưng không hẳn là vậy, mình vẫn muốn giảm tải cho Các bài học theo chương trình, các bài học chính này sẽ mang đến cho các bạn một kiến thức tối thiểu đủ để thực hành. Các kiến thức đầy đủ hơn sẽ được dời qua phần Bài viết bổ sung, như vậy các bạn sẽ cảm thấy nhẹ nhàng hơn với bài học chính, và dễ truy cứu hơn ở các bài viết bổ sung. Ngoài ra thì blog của mình còn dành một phần riêng, đó là Học qua các project nhỏ, phần này được viết theo yêu cầu của các bạn, những người mang đến cho mình những câu hỏi, những ý tưởng, rồi từ đó mình làm lại thành một hướng dẫn nhỏ và để lên đây cho mọi người cùng tham khảo.
Quay lại chủ đề bài viết, thông qua Bài 10 các bạn đã biết rõ về 2 loại layout được sử dụng nhiều nhất hiện nay, đó là LinearLayout và RelativeLayout. Bài hôm nay chúng ta cùng nhắc lại (mà không nói kỹ) 2 layout đó và cùng xem tiếp những loại layout còn lại của Android nhé.
FrameLayout – Đơn Giản Nhưng Ít Dùng
FrameLayout được xây dựng ra khá đơn giản, chúng chỉ như một cửa sổ dành riêng trên màn hình để hiển thị MỘT thành phần đơn lẻ nào đó. Điều này có nghĩa là FrameLayout không “khéo” để có thể sắp xếp các thành phần con của nó theo một trật tự “xếp lớp” như với LinearLayout. Hay cho phép các thành phần con tự canh chỉnh vị trí của mình theo các “mối quan hệ” như với RelativeLayout. FrameLayout chỉ giỏi trong việc hiển thị một view, hoặc giả có nhiều view muốn để vào layout này thì nó cũng chỉ cho phép chúng xếp chồng lên nhau, hay neo vào một góc nào đó. Sự đơn giản này của FrameLayout làm cho chúng khó để có thể tạo nên một giao diện tốt tương thích với nhiều kích cỡ màn hình khác nhau trên thị trường.
Như vậy mục này chỉ nói lan man về FrameLayout mà không đi sâu với nó, để rồi sau này khi làm quen đến Fragment thì chúng ta lại nhắc đến FrameLayout một lần nữa, nhưng cũng chỉ thoảng qua vì rõ ràng vai trò của anh chàng này đơn giản chỉ là nơi để hiển thị một thành phần đơn lẻ, trong trường hợp đó thành phần đơn lẻ chính là Fragment. Hay bài viết về ScrollView cũng có nhắc đến FrameLayout. Các bạn chờ xem nhé.
LinearLayout – Sắp Xếp Các View Nằm Cạnh Nhau
LinearLayout đã được nói đến rất rất rất kỹ ở Bài 10 rồi nhé, các bạn hãy vào xem, mình có nói kỹ cả lý thuyết lẫn thực hành cho các bạn dễ hiểu nữa đó.
RelativeLayout – Sắp Xếp Các View Theo Mối Quan Hệ
Có thể nói RelativeLayout là layout được dùng nhiều nhất trong Android, vì sự thoải mái và linh động trong việc sắp xếp các view con của nó. Điểm trừ lớn nhất của RelativeLayout có lẽ ở chỗ bạn phải tạo và quản lý quá nhiều các ID cho các view, để chúng có thể định nghĩa vị trí thông qua việc canh chỉnh dựa trên các quan hệ với các ID đó.
RelativeLayout cũng được nói đến khá là kỹ trong Bài 10 luôn nhé, mời các bạn cùng xem.
TableLayout – Nghe Tên Là Biết Sẽ Liên Quan Đến Bảng
Bảng này không phải bảng viết đâu nhé, mà là bảng biểu với các dòng và cột. Nếu bạn là dân lập trình HTML, hoặc chí ít cũng biết chút đỉnh HTML, có thể bạn sẽ thích làm việc với bảng, layout dạng bảng này có tên là TableLayout.
Nhưng bạn nên cẩn thận, layout dạng bảng này lại rất ít dùng trong Android. Lý do thứ nhất, layout này được kế thừa từ ý tưởng xây dựng bảng của HTML, bạn phải định nghĩa ra các dòng, ở mỗi dòng bạn sẽ khai báo từng cột, điều này làm code của TableLayout sẽ bị rườm rà hơn so với các layout khác. Thứ hai, nếu muốn hiển thị bảng, LinearLayout hay RelativeLayout cũng giải quyết được, không tin ư, hãy cho mình một giao diện bảng nào đó, mình hiển thị giống vậy nhưng không phải TableLayout cho bạn xem. Thứ ba, nắm các quy tắc để canh chỉnh dòng-cột sao cho ưng ý sẽ hơi khó khăn cho người mới bắt đầu hơn các quy tắc của các layout khác.
Dù sao thì code của TableLayout cũng dễ đọc hơn, ít phải định nghĩa nhiều ID cho các view hơn.
Nếu như bạn cũng giống mình, tuy không thích layout này lắm nhưng cũng nên biết về nó, và bài viết hôm nay sẽ giúp các bạn hiểu về TableLayout.
Không có một cách nào để chia nhỏ bài học TableLayout này ra làm từng đề mục cụ thể như các layout khác, vậy bạn hãy cùng mình đi theo mạch xây dựng ví dụ sau nhé.
Khai Báo TableLayout
Về cơ bản TableLayout là con của LinearLayout, thật ư? Đúng vậy, vì vậy mình mới chắc nịch với bạn rằng không cần dùng TableLayout mà chỉ cần LinearLayout thôi cũng đủ xây dựng các giao diện dạng bảng là vậy.
Bạn bắt đầu khai báo một TableLayout như vầy.
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > </TableLayout>
Quy Tắc Xây Dựng Dòng (Row) Và Cột (Column)
Dòng (row) là do bạn xây dựng, tùy theo yêu cầu thực tế của giao diện, bạn sẽ quyết định được mình cần bao nhiêu dòng cho bảng. Mỗi dòng sẽ nằm trong một cặp mở/đóng tag TableRow.
Mình ví dụ rằng bảng của chúng ta có hai dòng, vậy hãy khai báo như sau.
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow> </TableRow> <TableRow> </TableRow> </TableLayout>
Rồi nhé, chúng ta đã tạo ra hai dòng rỗng. Bây giờ nếu bạn thêm các widget vào từng dòng, chúng sẽ là các cột (column) của dòng đó. Khi này Android sẽ bố trí các cột theo quy luật của nó.
Để cho bạn thấy quy luật tạo ra các cột của Android như nào, mình sẽ đặt vào dòng thứ nhất 2 widget, dòng thứ hai 3 widget như sau.
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow> <TextView android:id="@+id/tv1_1" android:text="Name" android:layout_margin="4dp"/> <Button android:id="@+id/btn1_2" android:text="Click to see" android:layout_margin="4dp"/> </TableRow> <TableRow> <TextView android:id="@+id/tv2_1" android:text="Phone Number" android:layout_margin="4dp"/> <EditText android:id="@+id/et2_2" android:hint="Your number here" android:layout_margin="4dp"/> <TextView android:id="@+id/tv2_3" android:text="(required)" android:layout_margin="4dp"/> </TableRow> </TableLayout>
Mới demo một tí mà bạn có thể thấy độ dài của các dòng code XML rồi đúng không nào.
Như bạn thấy thì khi các widget được để vào từng dòng, Android sẽ chia ra làm các cột tương ứng, vì dòng thứ nhất có 2 item, dòng thứ hai có 3 item, tổng kết lại bảng của chúng ta sẽ trông như có 2 dòng và 3 cột (mặc dù dòng thứ nhất bị khuyết một cột).
Bạn có thích cách sắp xếp các cột như mặc định này không? Dĩ nhiên là không rồi, mọi thứ trông như một mớ hỗn độn. Giả sử yêu cầu mong muốn rằng Button ở dòng thứ nhất phải dài hết không gian còn lại của dòng, tức là ô chứa Button đó phải có độ rộng là sự kết hợp không gian của 2 cột còn lại.
Đơn giản quá vì các widget ở trong TableLayout có thêm thuộc tính android:layout_span giúp chúng kết hợp (span) các cột với nhau. Vậy chúng ta hãy set giá trị layout_span cho Button như sau.
<Button android:id="@+id/btn1_2" android:text="Click to see" android:layout_margin="4dp" android:layout_span="2"/>
Kết quả của layout_span như sau.
Bạn chú ý là với TableLayout thì bạn sẽ không điều khiển kích cỡ của các widget theo android:layout_width và android:layout_height nữa. Thay vào đó là các thuộc tính dành cho cột mà chúng ta vừa làm quen trên đây.
Chúng ta tiếp tục với việc thay đổi yêu cầu giao diện. Giả sử bạn không muốn TextView “Phone Number” xuất hiện nữa, thay vào vị trí đó chính là EditText “Your number here”. Và TextView “(required)” vẫn ở dòng thứ hai nhưng phải nằm về phía phải so với Button ở dòng đầu tiên cơ.
Chúng ta cùng phân tích yêu cầu. Nếu như xem 2 widget ở dòng thứ nhất là 2 cột. Dòng thứ hai chúng ta bỏ 1 widget rồi thì còn 2 widget, cũng sẽ là 2 cột, nhưng như đã nói, item của dòng thứ hai mình lại muốn hiển thị như là cột thứ ba (vì nó nằm bên phải Button). Wow ý tưởng đã có rồi đó, làm sao set text “(required)” như là cột thứ ba chứ không phải mặc định của nó là cột thứ hai. Trong TableLayout có thuộc tính android:layout_column giúp chúng ta chỉ định thứ tự cột mà widget đó muốn, với 0 là cột đầu tiên. Như vậy với mong muốn này chúng ta sẽ chuyển đổi code như sau.
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TableRow> <TextView android:id="@+id/tv1_1" android:layout_margin="4dp" android:text="Name" /> <Button android:id="@+id/btn1_2" android:layout_margin="4dp" android:text="Click to see" /> </TableRow> <TableRow> <EditText android:id="@+id/et2_2" android:layout_margin="4dp" android:background="#FFFF00" android:hint="Your number here" /> <TextView android:id="@+id/tv2_3" android:layout_column="2" android:layout_margin="4dp" android:background="#00FFFF" android:text="(required)" /> </TableRow> </TableLayout>
Dòng có layout_column được mình tô sáng lên trong code. Và khi đó giao diện mong muốn như sau.
Theo như vị trí của các widget bạn sẽ thấy chúng sắp xếp như những gì chúng ta muốn. Mình set background cho 2 widget ở dòng thứ hai cho bạn thấy rõ vị trí của chúng, hơn là để ý vào đường gạch đứt màu xanh của editor, các đường gạch đứt này có vẻ sai sai.
Một Dòng Mà Không Phải Một Dòng
Bạn nghĩ rằng TableLayout chỉ chứa các TableRow là các dòng chuẩn? Trước đây mình cũng nghĩ vậy, nhưng rồi phát hiện ra nếu bạn thêm một widget vào giữa các dòng (TableRow) đó, TableLayout sẽ xem như widget đó là một dòng chuẩn, với độ rộng của widget đó tương tự như độ rộng của một dòng trong bảng vậy.
Bạn hãy xem code như sau, mình chèn 2 TextView vào giữa các dòng để tạo nhãn cho từng dòng.
<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="Row 1" android:textStyle="bold" android:background="#D2D2D2"/> <TableRow> <TextView android:id="@+id/tv1_1" android:layout_margin="4dp" android:text="Name" /> <Button android:id="@+id/btn1_2" android:layout_margin="4dp" android:text="Click to see" /> </TableRow> <TextView android:text="Row 2" android:textStyle="bold" android:background="#D2D2D2"/> <TableRow> <EditText android:id="@+id/et2_2" android:layout_margin="4dp" android:background="#FFFF00" android:hint="Your number here" /> <TextView android:id="@+id/tv2_3" android:layout_column="2" android:layout_margin="4dp" android:background="#00FFFF" android:text="(required)" /> </TableRow> </TableLayout>
Khi đó giao diện sẽ trông như sau.
Dãn Ra (Stretch), Co Lại (Shrink), Và Thu Lại (Collapse)
Sự huyền diệu và phức tạp của TableLayout đến đây đã lộ rõ, và tin vui với các bạn rằng đây cũng là các thông tin cuối cùng dành cho TableLayout.
Qua các ví dụ trên đây bạn cũng thấy rằng khi bạn đặt các widget vào các dòng, thì các cột được tạo ra tương ứng, với chiều rộng của mỗi cột chính là chiều rộng của các widget. Bạn có thể sẽ nhìn thấy khoảng trống còn lại bên trong TableLayout khi các widget không chiếm đủ không gian rộng này. Hoặc có cột sẽ ra khỏi màn hình nếu bạn để quá nhiều widget vào trong một dòng.
Hãy cùng xem qua các thuộc tính bên dưới dành cho TableLayout (không phải cho view con như các ví dụ trên kia) giúp canh chỉnh các view con trông đẹp hơn nhé.
Dãn Ra (Stretch)
Để giải quyết các trường hợp không chiếm trọn không gian rộng, hoặc tràn ra khỏi màn hình trên, đầu tiên Android cho ra khái niệm android:stretchColumns (làm dãn cột). Khi này tham số truyền vào cho thuộc tính này chính là thứ tự của cột muốn làm dãn. Thứ tự đó có thể là thứ tự của một cột, hoặc nhiều cột cách nhau bằng dấu phẩy, hoặc tất cả các cột được định nghĩa bằng dấu sao (*). Cột nào được chỉ định stretch sẽ có chiều rộng dãn ra sao cho tổng chiều rộng các cột sẽ bằng chiều rộng của TableLayout.
Ví dụ sau mình cho cột đầu tiên của TableLayout bị dãn ra nhé.
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:stretchColumns="0"> </TableLayout>
Mình chỉ hiển thị code của TableLayout thôi nhé, các widget con của TableLayout này vẫn như ở ví dụ trước.
Bạn có để ý thấy cột thứ nhất được rộng ra hơn, trong khi các cột còn lại vẫn giữ quy luật cũ. Với sự nâng cấp nhỏ này, bảng của chúng ta trông đầy đặn hơn vì đã tận dụng hết chiều rộng của màn hình rồi phải không nào.
Hình ảnh sau là khi mình chỉ định android:stretchColumns=”0,1″, tham số có chứa 2 cột thay vì 1 như trên đây. Và cái kết.
Bạn có thấy sự khác biệt không? Tôi cá là bạn thấy có đấy. Bạn hãy thử với android:stretchColumns=”*” để xem sự khác biệt khi tất cả các cột trong bảng bị dãn ra nhé.
Co Lại (Shrink)
Ngược lại hoàn toàn với dãn ra, thuộc tính co lại android:shrinkColumns sẽ làm một cột, nhiều cột, hoặc tất cả các cột co lại để đảm bảo tất cả các cột trong bảng đều nằm gọn trong không gian rộng của bảng. Khi này nếu widget có chứa text, chúng sẽ bị rớt xuống nhiều dòng để dành không gian rộng cho các widget khác.
Thuộc tính này rất hữu dụng khi mà bảng của bạn chứa quá nhiều cột mà bạn vẫn muốn chúng được hiển thị.
Các tham số truyền vào tương tự như ở android:stretchColumns, ở đây mình chỉ ví dụ với một tham số truyền vào là cột thứ 0, bạn xem thử code nhé.
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:shrinkColumns="0"> </TableLayout>
Và cái kết đã được báo trước.
Thu Lại (Collapse)
Thu lại sẽ làm cho một cột, hoặc nhiều cột trong bảng của bạn bị… biến mất. Nó giống với lệnh hide khi bạn dùng bảng trên excel vậy.
Thuộc tính cho chức năng này là android:collapseColumns, giá trị truyền vào là một hoặc nhiều cột (thuộc tính này không định nghĩa giá trị truyền vào là “*” đâu nhé).
Ví dụ sau mình ẩn cột thứ nhất trong bảng.
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:collapseColumns="0"> </TableLayout>
Và kết quả này là.
Còn một ý nhỏ cuối cùng của TableLayout nhưng nó không quan trọng lắm, đó là bạn có thể lồng TableLayout khác vào trong một dòng của TableLayout cha, để tạo ra giao diện phức tạp hơn, nhưng cách này được khuyến khích không nên làm vì nó phức tạp thật.
Bạn vừa cùng mình đi qua các layout được dùng thường xuyên hoặc quan trọng trong Android. Với các layout này, bạn có thể thiết kế bất cứ giao diện từ đơn giản đến phức tạp nào. Mình dự định nói luôn đến ScrollView nhưng sợ bài viết quá dài, vậy mình xin phép nói đến vấn đề này ở bài sau nhé. Và ConstraintLayout cũng sẽ không đủ để nói trong bài hôm nay, mình đã viết riêng layout đặc biệt này ở đây, bạn xem thêm nhé.
Dĩ nhiên trong Android cũng còn nhiều các layout khác chứ không riêng các layout ở bài viết này. Đơn cử có thể kể đến như AbsoluteLayout đã “chết yểu” khá lâu, hay các layout chuyên dụng khác dùng cho các component chuyên dụng của Android sẽ được nói đến sau. Chúng đều không quan trọng và không làm ảnh hưởng đến cách thiết kế giao diện của bạn.
Cảm ơn bạn đã đọc các bài viết của Yellow Code Books. Bạn hãy ủng hộ blog bằng cách:
– Đánh giá 5 sao bên dưới mỗi bài nếu thấy thích.
– Comment bên dưới mỗi bài nếu có thắc mắc.
– Để lại địa chỉ email của bạn ở thanh bên phải để nhận được thông báo sớm nhất khi có bài viết mới.
– Chia sẻ các bài viết của Yellow Code Books đến nhiều người khác.
3 comments
Reblogged this on gioilaptrinh.

markdown:
Nội dung bài viết
[FrameLayout – Đơn Giản Nhưng Ít Dùng](#FrameLayout_8211_Don_Gian_Nhung_It_Dung) [LinearLayout – Sắp Xếp Các View Nằm Cạnh Nhau](#LinearLayout_8211_Sap_Xep_Cac_View_Nam_Canh_Nhau) [RelativeLayout – Sắp Xếp Các View Theo Mối Quan Hệ](#RelativeLayout_8211_Sap_Xep_Cac_View_Theo_Moi_Quan_He) [TableLayout – Nghe Tên Là Biết Sẽ Liên Quan Đến Bảng](#TableLayout_8211_Nghe_Ten_La_Biet_Se_Lien_Quan_Den_Bang) *Được chỉnh sửa ngày 9/11/2017.*
Chào mừng các bạn đến với bài viết bổ sung cho kiến thức còn khuyết của
*. Nói là khuyết nhưng không hẳn là vậy, mình vẫn muốn giảm tải cho Bài 10* *, các bài học chính này sẽ mang đến cho các bạn một kiến thức tối thiểu đủ để thực hành. Các kiến thức đầy đủ hơn sẽ được dời qua phần* [Các bài học theo chương trình](https://yellowcodebooks.com/category/lap-trinh-android/bai-hoc-theo-chuong-trinh/) *, như vậy các bạn sẽ cảm thấy nhẹ nhàng hơn với bài học chính, và dễ truy cứu hơn ở các bài viết bổ sung. Ngoài ra thì blog của mình còn dành một phần riêng, đó là* [Bài viết bổ sung](https://yellowcodebooks.com/category/lap-trinh-android/bai-viet-bo-sung/) *, phần này được viết theo yêu cầu của các bạn, những người mang đến cho mình những câu hỏi, những ý tưởng, rồi từ đó mình làm lại thành một hướng dẫn nhỏ và để lên đây cho mọi người cùng tham khảo.* [Học qua các project nhỏ](https://yellowcodebooks.com/category/lap-trinh-android/hoc-qua-cac-project-nho/)
Quay lại chủ đề bài viết, thông qua
* các bạn đã biết rõ về 2 loại layout được sử dụng nhiều nhất hiện nay, đó là Bài 10* *và* **LinearLayout** *. Bài hôm nay chúng ta cùng nhắc lại (mà không nói kỹ) 2 layout đó và cùng xem tiếp những loại layout còn lại của Android nhé.* **RelativeLayout**
# FrameLayout – Đơn Giản Nhưng Ít Dùng
* được xây dựng ra khá đơn giản, chúng chỉ như một cửa sổ dành riêng trên màn hình để hiển thị MỘT thành phần đơn lẻ nào đó. Điều này có nghĩa là FrameLayout* *FrameLayout*không *“khéo”*để có thể sắp xếp các thành phần con của nó theo một trật tự *“xếp lớp”*như với *LinearLayout*. Hay cho phép các thành phần con tự canh chỉnh vị trí của mình theo các *“mối quan hệ”*như với *RelativeLayout*. *FrameLayout*chỉ giỏi trong việc hiển thị một view, hoặc giả có nhiều view muốn để vào layout này thì nó cũng chỉ cho phép chúng xếp chồng lên nhau, hay neo vào một góc nào đó. Sự đơn giản này của *FrameLayout*làm cho chúng khó để có thể tạo nên một giao diện tốt tương thích với nhiều kích cỡ màn hình khác nhau trên thị trường.
Như vậy mục này chỉ nói lan man về
*FrameLayout* mà không đi sâu với nó, để rồi sau này khi làm quen đến *Fragment* thì chúng ta lại nhắc đến *FrameLayout* một lần nữa, nhưng cũng chỉ thoảng qua vì rõ ràng vai trò của anh chàng này đơn giản chỉ là nơi để hiển thị một thành phần đơn lẻ, trong trường hợp đó thành phần đơn lẻ chính là *Fragment*. Hay bài viết về *ScrollView* cũng có nhắc đến *FrameLayout*. Các bạn chờ xem nhé.
# LinearLayout – Sắp Xếp Các View Nằm Cạnh Nhau
* đã được nói đến rất rất rất kỹ ở LinearLayout* *rồi nhé, các bạn hãy vào xem, mình có nói kỹ cả lý thuyết lẫn thực hành cho các bạn dễ hiểu nữa đó.* [Bài 10](http://yellowcodebooks.com/2016/11/17/android-bai-10-di-sau-vao-layout/)
# RelativeLayout – Sắp Xếp Các View Theo Mối Quan Hệ
Có thể nói
* là layout được dùng nhiều nhất trong Android, vì sự thoải mái và linh động trong việc sắp xếp các view con của nó. Điểm trừ lớn nhất của RelativeLayout* *RelativeLayout*có lẽ ở chỗ bạn phải tạo và quản lý quá nhiều các ID cho các view, để chúng có thể định nghĩa vị trí thông qua việc canh chỉnh dựa trên các quan hệ với các ID đó. *RelativeLayout* cũng được nói đến khá là kỹ trong * luôn nhé, mời các bạn cùng xem. Bài 10*
# TableLayout – Nghe Tên Là Biết Sẽ Liên Quan Đến Bảng
Bảng này không phải bảng viết đâu nhé, mà là bảng biểu với các dòng và cột. Nếu bạn là dân lập trình HTML, hoặc chí ít cũng biết chút đỉnh HTML, có thể bạn sẽ thích làm việc với bảng, layout dạng bảng này có tên là
*. TableLayout*
Nhưng bạn nên cẩn thận, layout dạng bảng này lại rất ít dùng trong Android. Lý do thứ nhất, layout này được kế thừa từ ý tưởng xây dựng bảng của HTML, bạn phải định nghĩa ra các dòng, ở mỗi dòng bạn sẽ khai báo từng cột, điều này làm code của
*TableLayout* sẽ bị rườm rà hơn so với các layout khác. Thứ hai, nếu muốn hiển thị bảng, *LinearLayout* hay *RelativeLayout* cũng giải quyết được, không tin ư, hãy cho mình một giao diện bảng nào đó, mình hiển thị giống vậy nhưng không phải *TableLayout* cho bạn xem. Thứ ba, nắm các quy tắc để canh chỉnh dòng-cột sao cho ưng ý sẽ hơi khó khăn cho người mới bắt đầu hơn các quy tắc của các layout khác.
Dù sao thì code của
*TableLayout* cũng dễ đọc hơn, ít phải định nghĩa nhiều ID cho các view hơn.
Nếu như bạn cũng giống mình, tuy không thích layout này lắm nhưng cũng nên biết về nó, và bài viết hôm nay sẽ giúp các bạn hiểu về
*TableLayout*.
Không có một cách nào để chia nhỏ bài học
*TableLayout* này ra làm từng đề mục cụ thể như các layout khác, vậy bạn hãy cùng mình đi theo mạch xây dựng ví dụ sau nhé.
## Khai Báo TableLayout
Về cơ bản
*TableLayout* là con của *LinearLayout*, thật ư? Đúng vậy, vì vậy mình mới chắc nịch với bạn rằng không cần dùng *TableLayout* mà chỉ cần *LinearLayout* thôi cũng đủ xây dựng các giao diện dạng bảng là vậy.
Bạn bắt đầu khai báo một
*TableLayout* như vầy.
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > </TableLayout>
## Quy Tắc Xây Dựng Dòng (Row) Và Cột (Column)
Dòng (row) là do bạn xây dựng, tùy theo yêu cầu thực tế của giao diện, bạn sẽ quyết định được mình cần bao nhiêu dòng cho bảng. Mỗi dòng sẽ nằm trong một cặp mở/đóng tag
*. TableRow*
Mình ví dụ rằng bảng của chúng ta có hai dòng, vậy hãy khai báo như sau.
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow> </TableRow> <TableRow> </TableRow> </TableLayout>
Rồi nhé, chúng ta đã tạo ra hai dòng rỗng. Bây giờ nếu bạn thêm các widget vào từng dòng, chúng sẽ là các cột (column) của dòng đó. Khi này Android sẽ bố trí các cột theo quy luật của nó.
Để cho bạn thấy quy luật tạo ra các cột của Android như nào, mình sẽ đặt vào dòng thứ nhất 2 widget, dòng thứ hai 3 widget như sau.
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow> <TextView android:id="@+id/tv1_1" android:text="Name" android:layout_margin="4dp"/> <Button android:id="@+id/btn1_2" android:text="Click to see" android:layout_margin="4dp"/> </TableRow> <TableRow> <TextView android:id="@+id/tv2_1" android:text="Phone Number" android:layout_margin="4dp"/> <EditText android:id="@+id/et2_2" android:hint="Your number here" android:layout_margin="4dp"/> <TextView android:id="@+id/tv2_3" android:text="(required)" android:layout_margin="4dp"/> </TableRow> </TableLayout>
Mới demo một tí mà bạn có thể thấy độ dài của các dòng code XML rồi đúng không nào.
Như bạn thấy thì khi các widget được để vào từng dòng, Android sẽ chia ra làm các cột tương ứng, vì dòng thứ nhất có 2 item, dòng thứ hai có 3 item, tổng kết lại bảng của chúng ta sẽ trông như có 2 dòng và 3 cột (mặc dù dòng thứ nhất bị khuyết một cột).
Bạn có thích cách sắp xếp các cột như mặc định này không? Dĩ nhiên là không rồi, mọi thứ trông như một mớ hỗn độn. Giả sử yêu cầu mong muốn rằng
*Button* ở dòng thứ nhất phải dài hết không gian còn lại của dòng, tức là ô chứa *Button* đó phải có độ rộng là sự kết hợp không gian của 2 cột còn lại.
Đơn giản quá vì các widget ở trong
*TableLayout* có thêm thuộc tính * giúp chúng kết hợp (span) các cột với nhau. Vậy chúng ta hãy set giá trị android:layout_span* *layout_span*cho *Button*như sau.
<Button android:id="@+id/btn1_2" android:text="Click to see" android:layout_margin="4dp" android:layout_span="2"/>
Kết quả của
*layout_span* như sau.
Bạn chú ý là với
*TableLayout* thì bạn sẽ không điều khiển kích cỡ của các widget theo * và android:layout_width* *nữa. Thay vào đó là các thuộc tính dành cho cột mà chúng ta vừa làm quen trên đây.* **android:layout_height**
Chúng ta tiếp tục với việc thay đổi yêu cầu giao diện. Giả sử bạn không muốn
*TextView* *“Phone Number”* xuất hiện nữa, thay vào vị trí đó chính là *EditText* *“Your number here”*. Và *TextView* *“(required)”* vẫn ở dòng thứ hai nhưng phải nằm về phía phải so với *Button* ở dòng đầu tiên cơ.
Chúng ta cùng phân tích yêu cầu. Nếu như xem 2 widget ở dòng thứ nhất là 2 cột. Dòng thứ hai chúng ta bỏ 1 widget rồi thì còn 2 widget, cũng sẽ là 2 cột, nhưng như đã nói, item của dòng thứ hai mình lại muốn hiển thị như là cột thứ ba (vì nó nằm bên phải
*Button*). Wow ý tưởng đã có rồi đó, làm sao set text *“(required)”* như là cột thứ ba chứ không phải mặc định của nó là cột thứ hai. Trong *TableLayout* có thuộc tính * giúp chúng ta chỉ định thứ tự cột mà widget đó muốn, với 0 là cột đầu tiên. Như vậy với mong muốn này chúng ta sẽ chuyển đổi code như sau. android:layout_column*
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TableRow> <TextView android:id="@+id/tv1_1" android:layout_margin="4dp" android:text="Name" /> <Button android:id="@+id/btn1_2" android:layout_margin="4dp" android:text="Click to see" /> </TableRow> <TableRow> <EditText android:id="@+id/et2_2" android:layout_margin="4dp" android:background="#FFFF00" android:hint="Your number here" /> <TextView android:id="@+id/tv2_3" android:layout_column="2" android:layout_margin="4dp" android:background="#00FFFF" android:text="(required)" /> </TableRow> </TableLayout>
Dòng có
*layout_column* được mình tô sáng lên trong code. Và khi đó giao diện mong muốn như sau.
Theo như vị trí của các widget bạn sẽ thấy chúng sắp xếp như những gì chúng ta muốn. Mình set background cho 2 widget ở dòng thứ hai cho bạn thấy rõ vị trí của chúng, hơn là để ý vào đường gạch đứt màu xanh của editor, các đường gạch đứt này có vẻ sai sai.
## Một Dòng Mà Không Phải Một Dòng
Bạn nghĩ rằng
*TableLayout* chỉ chứa các *TableRow* là các dòng chuẩn? Trước đây mình cũng nghĩ vậy, nhưng rồi phát hiện ra nếu bạn thêm một widget vào giữa các dòng ( *TableRow*) đó, *TableLayout* sẽ xem như widget đó là một dòng chuẩn, với độ rộng của widget đó tương tự như độ rộng của một dòng trong bảng vậy.
Bạn hãy xem code như sau, mình chèn 2
*TextView* vào giữa các dòng để tạo nhãn cho từng dòng.
<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="Row 1" android:textStyle="bold" android:background="#D2D2D2"/> <TableRow> <TextView android:id="@+id/tv1_1" android:layout_margin="4dp" android:text="Name" /> <Button android:id="@+id/btn1_2" android:layout_margin="4dp" android:text="Click to see" /> </TableRow> <TextView android:text="Row 2" android:textStyle="bold" android:background="#D2D2D2"/> <TableRow> <EditText android:id="@+id/et2_2" android:layout_margin="4dp" android:background="#FFFF00" android:hint="Your number here" /> <TextView android:id="@+id/tv2_3" android:layout_column="2" android:layout_margin="4dp" android:background="#00FFFF" android:text="(required)" /> </TableRow> </TableLayout>
Khi đó giao diện sẽ trông như sau.
## Dãn Ra (Stretch), Co Lại (Shrink), Và Thu Lại (Collapse)
Sự huyền diệu và phức tạp của
*TableLayout* đến đây đã lộ rõ, và tin vui với các bạn rằng đây cũng là các thông tin cuối cùng dành cho *TableLayout*.
Qua các ví dụ trên đây bạn cũng thấy rằng khi bạn đặt các widget vào các dòng, thì các cột được tạo ra tương ứng, với chiều rộng của mỗi cột chính là chiều rộng của các widget. Bạn có thể sẽ nhìn thấy khoảng trống còn lại bên trong
*TableLayout* khi các widget không chiếm đủ không gian rộng này. Hoặc có cột sẽ ra khỏi màn hình nếu bạn để quá nhiều widget vào trong một dòng.
Hãy cùng xem qua các thuộc tính bên dưới dành cho
*TableLayout* (không phải cho view con như các ví dụ trên kia) giúp canh chỉnh các view con trông đẹp hơn nhé.
### Dãn Ra (Stretch)
Để giải quyết các trường hợp không chiếm trọn không gian rộng, hoặc tràn ra khỏi màn hình trên, đầu tiên Android cho ra khái niệm
* (làm dãn cột). Khi này tham số truyền vào cho thuộc tính này chính là thứ tự của cột muốn làm dãn. Thứ tự đó có thể là thứ tự của một cột, hoặc nhiều cột cách nhau bằng dấu phẩy, hoặc tất cả các cột được định nghĩa bằng dấu sao ( android:stretchColumns* *). Cột nào được chỉ định stretch sẽ có chiều rộng dãn ra sao cho tổng chiều rộng các cột sẽ bằng chiều rộng của* ***** *TableLayout*.
Ví dụ sau mình cho cột đầu tiên của
*TableLayout* bị dãn ra nhé.
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:stretchColumns="0"> </TableLayout>
Mình chỉ hiển thị code của
*TableLayout* thôi nhé, các widget con của *TableLayout* này vẫn như ở ví dụ trước.
Bạn có để ý thấy cột thứ nhất được rộng ra hơn, trong khi các cột còn lại vẫn giữ quy luật cũ. Với sự nâng cấp nhỏ này, bảng của chúng ta trông đầy đặn hơn vì đã tận dụng hết chiều rộng của màn hình rồi phải không nào.
Hình ảnh sau là khi mình chỉ định
*, tham số có chứa 2 cột thay vì 1 như trên đây. Và cái kết. android:stretchColumns=”0,1″*
Bạn có thấy sự khác biệt không? Tôi cá là bạn thấy có đấy. Bạn hãy thử với
* để xem sự khác biệt khi tất cả các cột trong bảng bị dãn ra nhé. android:stretchColumns=”*”*
### Co Lại (Shrink)
Ngược lại hoàn toàn với dãn ra, thuộc tính co lại
* sẽ làm một cột, nhiều cột, hoặc tất cả các cột co lại để đảm bảo tất cả các cột trong bảng đều nằm gọn trong không gian rộng của bảng. Khi này nếu widget có chứa text, chúng sẽ bị rớt xuống nhiều dòng để dành không gian rộng cho các widget khác. android:shrinkColumns*
Thuộc tính này rất hữu dụng khi mà bảng của bạn chứa quá nhiều cột mà bạn vẫn muốn chúng được hiển thị.
Các tham số truyền vào tương tự như ở
*, ở đây mình chỉ ví dụ với một tham số truyền vào là cột thứ 0, bạn xem thử code nhé. android:stretchColumns*
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:shrinkColumns="0"> </TableLayout>
Và cái kết đã được báo trước.
### Thu Lại (Collapse)
Thu lại sẽ làm cho một cột, hoặc nhiều cột trong bảng của bạn bị… biến mất. Nó giống với lệnh hide khi bạn dùng bảng trên excel vậy.
Thuộc tính cho chức năng này là
*, giá trị truyền vào là một hoặc nhiều cột (thuộc tính này không định nghĩa giá trị truyền vào là android:collapseColumns* *đâu nhé).* **“*”**
Ví dụ sau mình ẩn cột thứ nhất trong bảng.
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:collapseColumns="0"> </TableLayout>
Và kết quả này là.
Còn một ý nhỏ cuối cùng của
*TableLayout* nhưng nó không quan trọng lắm, đó là bạn có thể lồng *TableLayout* khác vào trong một dòng của *TableLayout* cha, để tạo ra giao diện phức tạp hơn, nhưng cách này được khuyến khích không nên làm vì nó phức tạp thật.
Bạn vừa cùng mình đi qua các layout được dùng thường xuyên hoặc quan trọng trong Android. Với các layout này, bạn có thể thiết kế bất cứ giao diện từ đơn giản đến phức tạp nào. Mình dự định nói luôn đến
** nhưng sợ bài viết quá dài, vậy mình xin phép nói đến vấn đề này ở bài sau nhé. Và ScrollView** *cũng sẽ không đủ để nói trong bài hôm nay, mình đã viết riêng layout đặc biệt này* **ConstraintLayout** [, bạn xem thêm nhé.](https://yellowcodebooks.com/2017/10/03/constraintlayout-phan-1-tim-hieu-cac-thanh-phan-co-ban/) *ở đây*
Dĩ nhiên trong Android cũng còn nhiều các layout khác chứ không riêng các layout ở bài viết này. Đơn cử có thể kể đến như
* đã AbsoluteLayout* *“chết yểu”*khá lâu, hay các layout chuyên dụng khác dùng cho các component chuyên dụng của Android sẽ được nói đến sau. Chúng đều không quan trọng và không làm ảnh hưởng đến cách thiết kế giao diện của bạn.
Cảm ơn bạn đã đọc các bài viết của
[. Bạn hãy ủng hộ blog bằng cách: Yellow Code Books](https://yellowcodebooks.com/)
–
* bên dưới mỗi bài nếu thấy thích. Đánh giá 5 sao*
–
*bên dưới mỗi bài nếu có thắc mắc.* **Comment**
–
*để nhận được thông báo sớm nhất khi có bài viết mới.* **Để lại địa chỉ email của bạn ở thanh bên phải**
–
*các bài viết của Yellow Code Books đến nhiều người khác.* **Chia sẻ**
## 3 comments
Reblogged this on gioilaptrinh.

X-nananana: Batcache

Cache-Control: max-age=300, must-revalidate

Vary: Cookie