A Day In The Life

とあるプログラマの備忘録

AndroidとiPhoneのUIの実装方法を比較する

使えるUI部品の種類は似たり寄ったりですね。iPhoneガベージコレクションが使えないのでオブジェクトの開放をしてやる必要があってめんどくさいです。

Viewの種類

iPhoneにはチェックボックスがなく代わりにUISwitchがあるのが面白いです。両者の違いはなんといっても階層データのナビゲーション方法の違いではないでしょう。Androidにはバックボタンがあるのでナビゲーション用のコントロールがありません。一方iPhoneはUINavigationBarというコントロールを使って階層データを表示させます。

iPhone Android
UIView View
UIWindow Window
UIScrollView ScrollView
UITableView ListView
UIImageView ImageView
UIActionSheet Dialog
UIAlertView AlertDialog
UIProgressView ProgressBar
UIWebView WebView
UILabel TextView
UITextView EditText
UITextField EditText
UIButton Button
UISegmentedControl RadioButton
UIPicker Spinner
UIDatePicker DatePickerDialog
UISwitch CheckBox,ToggleButton
UISlider SeekBar
UIPageControl −−
UIToolbar Menu
UITabBar TabHost
UINavigationBar −−
−− Gallery
−− GridView
−− SurfaceView※
MKMapView MapView(オプション)

※UIスレッドと別のスレッドで動くビュー部品。ゲームなど高速描画が必要な時に使う

Viewの追加

iPhone

  • Interface Builderを使う場合

    Interface BuilderでViewとControllerの接続を行う(省略)

    @interface HogeViewController : UIViewController {
      UILabel *label;
    }
    @property (nonatomic, retain) IBOutlet UILabel *label;
    @end
    
    @implementation
    @synthesize label;
    - (void)viewDidLoad {
      [super viewDidLoad];
      label.text = @"Hello world!";
    }
    - (void)dealloc {
      // メモリ領域の開放
      [label release];
      [super dealloc];
    }
    @end
    


  • Interface Builderを使わない場合

    @implementation HogeViewController
    - (void)viewDidLoad {
      UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 20)];
      label.text = @"Hello world!";
      [self addSubView:label];
      [label release];
    }
    @end
    

Android

  • レイアウトXMLを使う場合

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">
      <TextView
        id="@+id/label"
        android:text="Hello world!"
        android:layout_width="300sp"
        android:layout_height="wrap_content" />
    </LinearLayout>
    
    public class HogeActivity extends Activity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView label = (TextView)findViewById(R.id.label);
        label.setText("Hello world!");
      }
    }
    


  • レイアウトXMLを使わない場合

    public class HogeActivity extends Activity {
      @Override
      protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        TextView label = new TextView(this);
        label.setText("Hello world!");
        label.setWidth(300);
        label.setHeight(20);
        setContentView(label);
      }
    }