рд░реВрдмреА (рд░реВрдмреЛрдЯреЛ) рдкрд░ рдПрдХ Android рдРрдк рд▓рд┐рдЦрдирд╛

рдХрд┐рд╕реА рддрд░рд╣ рдореБрдЭреЗ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рд░реВрдмреА рдкрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЪрд╛рд░ (рдпрд╛ рдореЛрдмрд╛рдЗрд▓ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдЧрдгрдирд╛) рдерд╛ред рдФрд░ рдлрд┐рд░ рдореБрдЭреЗ рдПрдХ рдРрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рдЖрдпрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд░реВрдмреАрдирд╛рдо рдкреЙрдбрдХрд╛рд╕реНрдЯ рдореЗрдВ рдХрдИ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ , рдпрд╣ рд░реВрдмреЛрдЯреЛ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ ред


рдЕрдЪреНрдЫрд╛, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП:
  1. JDK
  2. Android рдПрд╕рдбреАрдХреЗ
  3. JRuby
  4. рдордгрд┐ рд░реЛрдЯреЛ

рдореИрдВ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХреЛ рдкреЗрдВрдЯ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдореИрдВ рдХрд╛рдлреА рд╡рд┐рд╕реНрддреГрдд рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдХрд╛ рд▓рд┐рдВрдХ рдмреЗрд╣рддрд░ рджреЗрддрд╛ рд╣реВрдВ
рд╕рдм рдХреБрдЫ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЖрдзрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВред
ruboto gen app --package ru.nitrodev.demo_app 

demo_app рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдзреНрдпрд╛рди рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд░рдЪрдирд╛ рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░реЗрдВред рд╣рдорд╛рд░реА рдкрд╣рд▓реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА src рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реИ, рдФрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рдкрд╛рд╕ рдЬрд╛рдПрдВрдЧреЗред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реВрдВрдЧрд╛:
  1. рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд┐рд░реНрдорд╛рдг
  2. MediaPlayer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдбрд┐рдпреЛ рдЪрд▓рд╛рдПрдВ
  3. рдЧрддрд┐рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдБ
  4. рдЯрдЪ рд╕реНрдХреНрд░реАрди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг
  5. рдЗрдВрдЯреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ (рдкреЗрдЬ рдЦреЛрд▓рдиреЗ, рдбрд╛рдпрд▓ рдХрд░рдиреЗ)
  6. рдореЗрдиреВ рдирд┐рд░реНрдорд╛рдг
рдХреНрд░рдо рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВред

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд┐рд░реНрдорд╛рдг


рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо XML рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рддрд░реАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдо рдорд╛рдгрд┐рдХ рдХреЗ рд╕рднреА рд▓рдЪреАрд▓реЗрдкрди рдХреЛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХреЛрдб рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреАрдЖрдИ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ ruboto/widget.rb рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдкреАрдЖрдИ рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреАрдПрд╕рдПрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдкрд╛рда рдХреНрд╖реЗрддреНрд░ рдФрд░ 4 рдмрдЯрди рд╡рд╛рд▓реЗ рд▓рд╛рдЗрдирд┐рдпрд░рдЖрдЙрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрд╡рд╢реНрдпрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШрдЯрдХреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░реЗрдВ
 java_import "android.widget.Button" java_import "android.widget.TextView" java_import "android.widget.LinearLayout" 

рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ
  ll = LinearLayout.new(@ruboto_java_instance) ll.orientation = LinearLayout::VERTICAL tv = TextView.new(@ruboto_java_instance) tv.text = " Java" ll.add_view tv #  TextView  LinearLayout params = tv.get_layout_params params.width = ViewGroup::LayoutParams::MATCH_PARENT btn1 = Button.new(@ruboto_java_instance) btn1.text = "Play" btn1.on_click_listener = proc{ Play } ll.add_view btn1 params = search_b.get_layout_params params.width = ViewGroup::LayoutParams::MATCH_PARENT btn2 = Button.new(@ruboto_java_instance) btn2.text = "Pause" btn2.on_click_listener = proc{ Pause } ll.add_view btn2 params = search_b.get_layout_params params.width = ViewGroup::LayoutParams::MATCH_PARENT btn3 = Button.new(@ruboto_java_instance) btn3.text = " " btn3.on_click_listener = proc{ twoActivity } ll.add_view btn3 params = search_b.get_layout_params params.width = ViewGroup::LayoutParams::MATCH_PARENT btn4 = Button.new(@ruboto_java_instance) btn4.text = " " btn4.on_click_listener = proc{ threeActivity } ll.add_view btn4 params = search_b.get_layout_params params.width = ViewGroup::LayoutParams::MATCH_PARENT setContentView ll 

рдЖрдкрдХреЛ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдХреЛрдб рдЬрд╛рд╡рд╛ рдЬрд┐рддрдирд╛ рд╣реА рдмреЛрдЭрд┐рд▓ рд╣реИ рдФрд░ рд╢рд╛рдпрдж рд╣реА рдХреЛрдИ рдЗрд╕реЗ рд░реВрдмреА рд╕рдореБрджрд╛рдп рдореЗрдВ рдкрд╕рдВрдж рдХрд░реЗрдЧрд╛ред рдбреАрдПрд╕рдПрд▓ рд░реВрдмреЛрдЯреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реЛрдЧрд╛ред рд░реВрдмреЛрдЯреЛ рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рди рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

 ruboto_import_widgets :Button, :LinearLayout, :TextView self.content_view = linear_layout :orientation => :vertical do text_view :text => ' Ruby -  ', :width => :match_parent button :text => 'Play', :width => :match_parent, :on_click_listener => proc { play } button :text => 'Pause', :width => :match_parent, :on_click_listener => proc { pause } button :text => ' ', :width => :match_parent, :on_click_listener => proc { twoActivity } button :text => ' ', :width => :match_parent, :on_click_listener => proc { threeActivity } end 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ 4-5 рдЧреБрдирд╛ рдХрдо рд╣реЛ рдЧрдИ рд╣реИред
рдЗрд╕ рдХреЛрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо


MediaPlayer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдбрд┐рдпреЛ рдЪрд▓рд╛рдПрдВ


рдзреНрд╡рдирд┐ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, MediaPlayer рдФрд░ AudioManager рдХреЛ рдЖрдпрд╛рдд рдХрд░реЗрдВ
 java_import "android.media.MediaPlayer" java_import "android.media.AudioManager" java_import "android.net.Uri" 

рдлрд┐рд░ рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХрд╛ uri рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ MediaPlayer рдмрдирд╛рддреЗ рд╣реИрдВ

 java_file = java.io.File.new("/mnt/sdcard/naive.mp3") uri = Uri.fromFile(java_file) @player = MediaPlayer.create(self, uri); 

рд╣рдо рдЕрдкрдиреЗ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
 @player.start @player.pause 

рдЧрддрд┐рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдБ


рд╣рдорд╛рд░реЗ manul рдХреЗ рд╢реЗрд╖ рдмрд┐рдВрджреБ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗред
RubotoActivity рдмрдирд╛рдиреЗ рдХрд╛ рдореБрдЦреНрдп рддрд░реАрдХрд╛ start_ruboto_activity рдХрд╛ рдЙрдкрдпреЛрдЧ start_ruboto_activity ред
start_ruboto_activity рдореЗрдВ рдПрдВрдбреНрд░реЙрдЗрдб start_ruboto_activity рдмрд░рд╛рдмрд░ рдПрдВрдбреНрд░реЙрдЗрдб рд╣реИред рдЗрд╕рдХреЗ рджреЛ рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ: рдПрдХ рд▓рд╛рдЗрди рдЬрд┐рд╕рдореЗрдВ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд▓рд┐рдВрдХ рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдПрдХ рдмреНрд▓реЙрдХ рдЬрд┐рд╕реЗ рдЧрддрд┐рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╕рдордп рдПрдХ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдПрдХ рджреВрд╕рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ

 start_ruboto_activity("$activity_two") do def on_create(bundle) super setTitle ' ' end end 

рдЯрдЪ рд╕реНрдХреНрд░реАрди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг


рдЯрдЪ рдЯреНрд░реИрдХрд┐рдВрдЧ on_touch_event рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ onTouchEvent Android рд╡рд┐рдзрд┐ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред
рдПрдХ рдЙрдВрдЧрд▓реА рд╕реНрдкрд░реНрд╢ рдЯреНрд░реИрдХрд┐рдВрдЧ
 def on_touch_event(event) index = event.find_pointer_index(0) x = event.getX(index) y = event.getY(index) toast "Position: #{x}, #{y}" true end 

рдЗрд░рд╛рджреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рдЗрд░рд╛рджреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд Android API рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ
 java_import "android.content.Intent" 

рдЗрдВрдЯреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХрд╛ рдХрд╛рдо рдЬрд╛рд╡рд╛ рдХреЗ рд╕рдорд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

 intent = Intent.new(Intent::ACTION_CALL) intent.setData(Uri.parse("tel:5551234")) startActivity(intent) intent = Intent.new(Intent::ACTION_VIEW) intent.setData(Uri.parse("http://ruboto.org/")) startActivity(intent) 

AndroidManifest рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдЕрдиреБрдорддрд┐рдпрд╛рдВ рдЬреЛрдбрд╝реЗрдВ
 <uses-permission android:name="android.permission.CALL_PHONE" /> 

рдореЗрдиреВ рдирд┐рд░реНрдорд╛рдг


рдореЗрдиреВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд╛рдирдХ on_create_options_menu on_create_options_menu ред рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рд╣рдо рдореЗрдиреВ рдЖрдЗрдЯрдо рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрди рдкрд░ рдПрдХ рд╢реНрд░реЛрддрд╛ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ; рдЬрдм рдЖрдк toast рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ toast рддреЛ рдореЗрдиреВ рдЖрдЗрдЯрдо рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде toast рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
 def on_create_options_menu(menu) m1 = menu.add('Action 1') m1.set_on_menu_item_click_listener do |menu_item| @text_view.text = menu_item_title toast menu_item.title true end m2 = menu.add('Action 2') m2.set_on_menu_item_click_listener do |menu_item| @text_view.text = menu_item.title toast menu_item.title true end true end 


рдмрд╕ рдЗрддрдирд╛ рд╣реАред
рдЗрд╕ рд╕рднреА рдХреЛрдб рдХреЛ рдЬреАрдердм рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рд░реВрдмреЛрдЯреЛ рдореЗрдВ рдЧрд╣рд░реЗ рд╡рд┐рд╕рд░реНрдЬрди рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ:
рд╡рд┐рдХреА: github.com/ruboto/ruboto/wiki
Readme : github.com/ruboto/ruboto/blob/master/README.md
рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╢рд╛рдирджрд╛рд░ рдкреНрд░рд╕реНрддреБрддрд┐: jay.mcgavren.com/files/pretations/ruboto

Source: https://habr.com/ru/post/In165071/


All Articles