Wednesday, September 13, 2017

Hàm tô màu dùng mã hex code color trong Swift

Trong lập trình Swift, để tô màu cho chữ hoặc nút, ta dùng lệnh.
label.textColor = UIColor.blueColor()
Vấn đề là cách này chỉ có một số màu cơ bản, hãy để trỏ chuột vào sau dấu chấm UIColor. và ấn Ctrl+Space bar để xem các màu xổ ra. Bạn sẽ thấy không có nhiều màu lắm.

Nếu muốn màu khác, ta phải tự phối các yếu tố RGB như sau.
label.textColor = UIColor(red: 1, green: 0.4, blue: 1, alpha: 1)
Điều này sẽ mất thời gian hơn là dùng mã hex code.
Giả sử ta muốn dùng những mã hex code color đơn giản, kiểu như "#a1caf1", ta sẽ phải tạo một hàm riêng để dùng, hàm đó như sau.
func hex (hex:String) -> UIColor {
        var cString:String = hex.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet() as NSCharacterSet).uppercaseString
         if (cString.hasPrefix("#")) {
            cString = cString.substringFromIndex(cString.startIndex.advancedBy(1))
        }
      if ((cString.characters.count) != 6) {
            return UIColor.grayColor()
        }
       
        var rgbValue:UInt32 = 0
        NSScanner(string: cString).scanHexInt(&rgbValue)
       
        return UIColor(
            red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
            blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
            alpha: CGFloat(1.0)
        )
    }
Khi sử dụng, ta sẽ gọi như sau.
label.textColor = hex("#a1caf1")
view.backgroundColor = hex("#a1caf1")

Vậy là ta có thể cho bất cứ màu nào ta thích vào chữ hoặc nút bấm, hoặc đổ màu nền cho view.

Tạo viền trong Android

Giả sử ta muốn có viền xung quanh cho nút, textView hoặc cả layout bất kỳ
Ta sẽ làm như sau:
Nháy chuột phải vào folder src, new, folder, đặt tên là drawable.
Sau đó nháy chuột phải vào drawable, new, Android XML File, đặt tên là vien

Copy toàn bộ đoạn sau thay vào trong
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1dip"
 android:color="#4b5320" />
<solid
android:color="#ffffff" />

</shape>

Sau đó, tại bất cứ view nào cần có viền, bạn thêm dòng sau vào
android:background="@drawable/vien"
Một TextView có viền sẽ trông như sau
Bạn có thể dùng cho cả Linearlayout cũng được.
Thay mã hex code ở dòng android:color="#4b5320", ta sẽ có màu như ý muốn.
Muốn có góc tròn, thêm đoạn sau vào trong file vien.

<corners android:radius="8dp"/>

Tuesday, September 12, 2017

Truyền dữ liệu giữa các class trong lập trình ios (2)

Trong bài này ta sẽ truyền dữ liệu ngược trở về class trước, ở đây là ViewController.swift.
Giả sử sau khi sang class second, ta muốn lấy giá trị người dùng nhập vào textField để chuyển ngược về, ta sẽ làm như sau.
Tại ViewController.swift, thêm chữ sau vào đầu class.
DataEnteredDelegate

Cứ kệ lỗi đỏ đó. Tiếp theo, copy hàm sau vào trên ngoặc đóng cuối cùng
func setback(info: String){
      la.text = info
  }
Hàm này sẽ lấy giá trị chuỗi chuyển về từ class second và set nó ra Label la vốn đang có chữ ”Đây là chữ ví dụ”
Thêm dòng sau vào trong lệnh override func prepareForSegue
messageController.delegate = self

Sang class second, copy đoạn sau xuống ngay dưới lệnh import
protocol DataEnteredDelegate: class {
    func setback(info: String)
}
Thêm dòng sau vào sau ngay dưới dòng bắt đầu class
weak var delegate: DataEnteredDelegate? = nil

Sửa hàm func nut2 thành.
let nam = nhap.text
        if(nam == ""||nam == " "){
            toast("Bạn chưa nhập năm sinh")
        }
        else{
            self.delegate?.setback(nam!)
            self.dismissViewControllerAnimated(true, completion: nil)
            }
Trong hàm này, ta lấy giá trị của textField, nếu nó rỗng, yêu cầu người dùng nhập lại, nếu có dữ liệu rồi ta pass nó trở về màn hình trước thông qua hàm setback đã khai báo trong class ViewController. Để làm việc này ta cần có protocol đã khai báo ngay trên đầu chương trình.

Chạy thử, màn hình bật sang, ta nhập vào số nào đó.

Ấn nút Quit để thấy dòng chữ đã được chuyển về và set ra Label trên cùng.

Vậy ta đã chuyền đi, chuyển về dữ liệu từ ViewController sang class second.

Có thể chuyển bất cứ dữ liệu dạng nào, như mảng, chuỗi, số đều được.

Truyền dữ liệu giữa các class trong lập trình ios Swift

Truyền dữ liệu giữa các class là việc quan trọng, thường xuyên phải làm khi lập trình.
Ta sẽ làm truyền đi trước.
Trong baidau, để ví dụ ta sẽ chuyển chữ sang class second.
Nháy vào Main.storyboard, bây giờ ta sẽ nối ViewController của màn hình đầu với viewController Second.
Hãy nháy vào cái tam giác nhỏ bên trái của view Controller Scene và Second Scene để chúng sổ ra trông như sau.

Bây giờ nháy chuột phải vào dòng View Controller màu xanh, giữ, kéo cái gạch xanh đến dòng Second cũng có điểm vàng ở ngoài cùng.

Rồi thả tay, một của sổ bật ra, chọn show.


Tiếp, nháy chuột vào dòng Show segue to... vừa được tạo ra bên dưới View Controller.
Phía trên bên phải, dưới biểu tượng như con quay, chỗ Identifier ghi chữ ad vào, xong nháy ra ngoài để thấy bây giờ có chữ Show segue “ad” to “Second” ở bên trái. Và có đường nối giữa View Controller đầu và second.



Quay lại ViewController.swift, copy đoạn sau lên trên ngoặc đóng dưới cùng.
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "ad"{
            let messageController = segue.destinationViewController assecond
            let t = "Đây là chữ chuyn sang"
              messageController.sang = t
              }
    }
Sửa lệnh trong func nutnext thành.
self.performSegueWithIdentifier("ad", sender: self)
Lệnh mở ra class mới bây giờ phải có tên Segue ta đã đặt để nối giữa hai màn hình trong Main.storyboard. Tạm thời kệ dấu đỏ chỗ chữ sang.


Chữ “ad” ở đây chính là tên segue ta đã đặt khi nối hai View Controller trong storyboard.
Sang class second.swift, copy vào trên dòng override
var sang = " "
Thêm vào trong viewDidLoad.
la.text = sang

Giải thích.
Nếu ta không kéo để tạo segue, dữ liệu sẽ không chuyển qua được. Đây là bước kéo thả bắt buộc ta phải dùng. Và ta cũng chỉ vào storyboard để kéo như thế nếu cần chuyển dữ liệu sang thôi. Nếu không cần, bạn có thể bật ra màn hình mới như cách ở bài trước.
Ta chuyển qua dòng chữ vào một biến có tên sang thì ở bên class second ta cũng nhận lại nó với tên sang và set chữ đó vào Label la vốn đang có chữ “Nhập năm dương lịch”
Còn một cách làm khác không dùng segue nhưng thêm vài dòng, bạn thay các lệnh trong func nutnext
Thành let vc = second()
vc.sang="Đây là chữ chuyn sang"

self.presentViewController(vc, animated: true, completion: nil)

Đồng thời rào toàn bộ lệnh override trước đó thành  comment

cách này ta thậm chí không cần phải vào storyboard để kéo ra view Controller mới, không cần kéo để tạo segue.


Chạy thử để thấy chữ đã chuyển sang.

Truyền dữ liệu giữa các activity trong Android (2)

Trong bài này ta sẽ truyền dữ liệu ngược trở về Activity trước, ở đây sẽ là MainActivity.
Giả sử sau khi sang class second, ta muốn lấy giá trị người dùng nhập vào EditText để chuyển ngược về, ta sẽ làm như sau.
Tại MainActivity, sửa các lệnh trong nút b2 thành.
Intent in=new Intent(getBaseContext(),second.class);
Bundle bun = new Bundle();
bun.putString("chu",a );
bun.putInt("so", sovidu);
bun.putStringArray("gi", qua);
in.putExtras(bun);                                                                              
startActivityForResult(in, 1);
Lệnh chuyển đi có hơi khác một chút, ta dùng startActivityForResult tức là để chờ kết quả là cái gì đó sẽ chuyển về .
Copy tiếp những dòng sau lên trên dấu ngoặc đóng cuối cùng
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {    
   if (requestCode == 1) {
   if(resultCode==3){         
      Bundle bun = data.getExtras();
      String ve = bun.getString("iz");
         tv.setText(ve);
       }                
           } else if (resultCode == RESULT_CANCELED) {
             // Handle cancel
          }
       }
Mấu chốt ở đây là lệnh Override này, ta lấy về một String và set nó vào textView trên cùng. Để ý chữ resultCode == 3.

Tại class second, copy các dòng sau vào nút b2, trên chữ finish()
String nhap=e.getText().toString();
Intent in = getIntent();
Bundle bun = new Bundle();
bun.putString("iz", nhap);
in.putExtras(bun);
setResult(3, in);

Trong lệnh này, ta lấy String từ editText để truyền về class trước, chú ý dòng setResult(3, in);
Bên kia ta để resultCode là bao nhiêu thì setResult cũng thế.
Key để chuyển ta dùng “iz” thì bên kia cũng vậy.
Save lại và chạy chương trình, khi màn hình 2 bật ra thì nhập số nào đó bất kỳ vào ô Edittext để khi ấn Quit ta thấy nó đã được truyền về set lên textView trên cùng.