android_query 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +81 -33
- data/lib/android_query/version.rb +1 -1
- data/lib/android_query/views.rb +182 -0
- metadata +3 -3
- data/lib/android_query/android_query.rb +0 -178
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2cac681d57bb85063a53184fa2da5889f2c5b6cf
|
4
|
+
data.tar.gz: 0a02022cd528fe128f5d4e4b0c8796a5c9091556
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96a173ed0a4dae949e3ad96ecc0faac8324424c3f6327604aad7f106b8875618d8de9abeaa04caa1391279299ca45f405ab0373c4eda531bfec359039c2355f2
|
7
|
+
data.tar.gz: d63d96e315e7dc598aab325e691cb53b3227093e8766598b711d9c6c6f536c956b0c9d25a0b35bd120e1bc191e5b9b5681f3bb68ad770cec8ccd98ec08abe1ab
|
data/README.md
CHANGED
@@ -15,7 +15,7 @@ It's intended for developers who prefer to code their UIs rather than use a GUI
|
|
15
15
|
Add this line to your application's Gemfile:
|
16
16
|
|
17
17
|
```ruby
|
18
|
-
gem 'android_query', '~> 0.0.
|
18
|
+
gem 'android_query', '~> 0.0.5'
|
19
19
|
```
|
20
20
|
|
21
21
|
And then execute:
|
@@ -28,47 +28,95 @@ Or install it yourself as:
|
|
28
28
|
|
29
29
|
## Usage
|
30
30
|
|
31
|
+
The general rule is to create a top-level layout and add views to it.
|
32
|
+
Each view should be passed a style method.
|
33
|
+
|
31
34
|
```ruby
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
aq.
|
39
|
-
aq.
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
35
|
+
class MainActivity < Android::App::Activity
|
36
|
+
attr_accessor :aq, :counter
|
37
|
+
|
38
|
+
def onCreate(savedInstanceState)
|
39
|
+
super
|
40
|
+
self.counter = 0
|
41
|
+
self.aq = AndroidQuery.new(self, HomeStyle)
|
42
|
+
self.aq.linear_layout(:top_layout) do |top|
|
43
|
+
top.text_view(:phone_field)
|
44
|
+
top.edit_text(:email_field)
|
45
|
+
top.button(:submit_button)
|
46
|
+
top.linear_layout(:counter_layout) do |counter_layout|
|
47
|
+
counter_layout.button(:increment)
|
48
|
+
counter_layout.button(:decrement)
|
49
|
+
end
|
46
50
|
end
|
47
51
|
end
|
52
|
+
|
53
|
+
def show_message(view)
|
54
|
+
# toast options can be:
|
55
|
+
# for gravity: :bottom, :right, :left, :center, :top, and their combinations
|
56
|
+
# for length: :short, :long
|
57
|
+
self.aq.toast("The counter is set at #{self.counter}", gravity: :bottom_right, length: :short)
|
58
|
+
end
|
59
|
+
|
60
|
+
def increment_counter(view)
|
61
|
+
self.counter += 1
|
62
|
+
end
|
63
|
+
|
64
|
+
def decrement_counter(view)
|
65
|
+
self.counter -= 1
|
66
|
+
end
|
48
67
|
end
|
68
|
+
```
|
69
|
+
The previous code produces the following app:
|
70
|
+
![Sample Screenshot](screenshot.png)
|
49
71
|
|
50
|
-
def toast_me(view)
|
51
|
-
aq.toast("You've been toasted #{@counter} times!", gravity: :center)
|
52
|
-
end
|
53
|
-
|
54
|
-
def increase_counter(view)
|
55
|
-
@counter += 1
|
56
|
-
end
|
57
|
-
|
58
|
-
def decrease_counter(view)
|
59
|
-
@counter -= 1
|
60
|
-
end
|
61
72
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
73
|
+
The following is the `HomeStyle` class that styles the screen:
|
74
|
+
```ruby
|
75
|
+
class HomeStyle < AndroidMotionQuery::Stylesheet
|
76
|
+
def top_layout(v)
|
77
|
+
v.width = :mp # <-- :mp, :wc, or a number
|
78
|
+
v.height = :mp
|
79
|
+
v.orientation = :vertical # <-- or :horizontal
|
80
|
+
v.weight_sum = 10
|
81
|
+
end
|
82
|
+
|
83
|
+
def phone_field(v)
|
84
|
+
v.text = 'Hello My Style!'
|
85
|
+
v.weight = 4
|
86
|
+
end
|
87
|
+
|
88
|
+
def email_field(v)
|
89
|
+
v.text = 'This is my email'
|
90
|
+
v.weight = 1
|
91
|
+
end
|
92
|
+
|
93
|
+
def submit_button(v)
|
94
|
+
v.text = 'Click Me To See'
|
95
|
+
v.weight = 5
|
96
|
+
v.click = :show_message # <-- this would call the show_message(view) method on the activity
|
97
|
+
end
|
98
|
+
|
99
|
+
def counter_layout(v)
|
100
|
+
v.orientation = :horizontal
|
101
|
+
v.width = :mp
|
102
|
+
v.height = :wc
|
103
|
+
v.weight_sum = 2
|
104
|
+
end
|
105
|
+
|
106
|
+
def increment(v)
|
107
|
+
v.text = '+ Increment'
|
108
|
+
v.click = :increment_counter
|
109
|
+
v.weight = 1
|
110
|
+
end
|
111
|
+
|
112
|
+
def decrement(v)
|
113
|
+
v.text = '- Decrement'
|
114
|
+
v.click = :decrement_counter
|
115
|
+
v.weight = 1
|
116
|
+
end
|
67
117
|
end
|
68
118
|
```
|
69
119
|
|
70
|
-
![Sample Screenshot](screenshot.png)
|
71
|
-
|
72
120
|
## Contributing
|
73
121
|
|
74
122
|
Bug reports and pull requests are welcome on GitHub at https://github.com/aesmail/android_query.
|
@@ -0,0 +1,182 @@
|
|
1
|
+
module AndroidMotionQuery
|
2
|
+
class View
|
3
|
+
attr_accessor :view, :activity, :stylesheet, :style_name, :layout_params, :options
|
4
|
+
|
5
|
+
def initialize(view, activity, stylesheet, style_name, layout_params, options = {})
|
6
|
+
self.view = view
|
7
|
+
self.activity = activity
|
8
|
+
self.stylesheet = stylesheet
|
9
|
+
self.style_name = style_name
|
10
|
+
self.layout_params = layout_params
|
11
|
+
self.options = {
|
12
|
+
parent: nil,
|
13
|
+
}.merge(options)
|
14
|
+
end
|
15
|
+
|
16
|
+
def get
|
17
|
+
self.view
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_android_query_view(view, style_method, layout_params, options = {}, &block)
|
21
|
+
aqv = View.new(view, self.activity, self.stylesheet, style_method, layout_params, options)
|
22
|
+
self.stylesheet.apply_style_for(aqv, style_method, layout_params)
|
23
|
+
self.get.addView(aqv.get)
|
24
|
+
block.call(aqv) if block_given?
|
25
|
+
aqv
|
26
|
+
end
|
27
|
+
|
28
|
+
def linear_layout(style_method, &block)
|
29
|
+
view = Android::Widget::LinearLayout.new(self.activity)
|
30
|
+
lp = Android::Widget::LinearLayout::LayoutParams
|
31
|
+
create_android_query_view(view, style_method, lp, {}, &block)
|
32
|
+
end
|
33
|
+
|
34
|
+
def text_view(style_method, &block)
|
35
|
+
view = Android::Widget::TextView.new(self.activity)
|
36
|
+
create_android_query_view(view, style_method, self.layout_params, {}, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
def edit_text(style_method, &block)
|
40
|
+
view = Android::Widget::EditText.new(self.activity)
|
41
|
+
create_android_query_view(view, style_method, self.layout_params, {}, &block)
|
42
|
+
end
|
43
|
+
|
44
|
+
def button(style_method, &block)
|
45
|
+
view = Android::Widget::Button.new(self.activity)
|
46
|
+
create_android_query_view(view, style_method, self.layout_params, {}, &block)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class Stylesheet
|
51
|
+
def apply_style_for(view, style_name, layout_params)
|
52
|
+
style_view = StylesheetElement.new(view, layout_params)
|
53
|
+
self.send(style_name.to_s, style_view)
|
54
|
+
view.get.setLayoutParams(style_view.params)
|
55
|
+
view
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class StylesheetElement
|
60
|
+
attr_accessor :view, :params
|
61
|
+
|
62
|
+
LAYOUT_SIZE_OPTIONS = {
|
63
|
+
mp: Android::View::ViewGroup::LayoutParams::MATCH_PARENT,
|
64
|
+
wc: Android::View::ViewGroup::LayoutParams::WRAP_CONTENT,
|
65
|
+
}
|
66
|
+
|
67
|
+
ORIENTATION_OPTIONS = {
|
68
|
+
vertical: Android::Widget::LinearLayout::VERTICAL,
|
69
|
+
horizontal: Android::Widget::LinearLayout::HORIZONTAL,
|
70
|
+
}
|
71
|
+
|
72
|
+
def initialize(view, layout_params)
|
73
|
+
self.view = view
|
74
|
+
self.params = layout_params.new(LAYOUT_SIZE_OPTIONS[:mp], LAYOUT_SIZE_OPTIONS[:wc])
|
75
|
+
self
|
76
|
+
end
|
77
|
+
|
78
|
+
def text=(t)
|
79
|
+
self.view.get.text = t
|
80
|
+
end
|
81
|
+
|
82
|
+
def width=(w)
|
83
|
+
if w == :mp || w == :wc
|
84
|
+
self.params.width = LAYOUT_SIZE_OPTIONS[w]
|
85
|
+
else
|
86
|
+
self.params.width = w
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def height=(h)
|
91
|
+
if h == :mp || h == :wc
|
92
|
+
self.params.height = LAYOUT_SIZE_OPTIONS[h]
|
93
|
+
else
|
94
|
+
self.params.height = h
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def orientation=(o)
|
99
|
+
if o == :vertical || o == :horizontal
|
100
|
+
self.view.get.orientation = ORIENTATION_OPTIONS[o]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def weight_sum=(number)
|
105
|
+
self.view.get.weightSum = number
|
106
|
+
end
|
107
|
+
|
108
|
+
def weight=(number)
|
109
|
+
self.params.weight = number
|
110
|
+
end
|
111
|
+
|
112
|
+
def click=(method_name)
|
113
|
+
self.view.get.onClickListener = AQClickListener.new(self.view.activity, method_name)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
class AQClickListener
|
118
|
+
attr_accessor :activity, :method_name
|
119
|
+
def initialize(activity, method_name)
|
120
|
+
self.activity = activity
|
121
|
+
self.method_name = method_name
|
122
|
+
end
|
123
|
+
|
124
|
+
def onClick(view)
|
125
|
+
self.activity.send(self.method_name.to_s, view)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
class AndroidQuery
|
132
|
+
attr_accessor :activity, :stylesheet
|
133
|
+
|
134
|
+
def initialize(activity, stylesheet)
|
135
|
+
self.activity = activity
|
136
|
+
self.stylesheet = stylesheet.new
|
137
|
+
self
|
138
|
+
end
|
139
|
+
|
140
|
+
def create_android_query_view(view, style_method, layout_params, options = {})
|
141
|
+
AndroidMotionQuery::View.new(view, self.activity, self.stylesheet, style_method, layout_params, options)
|
142
|
+
end
|
143
|
+
|
144
|
+
def linear_layout(style_method, &block)
|
145
|
+
view = Android::Widget::LinearLayout.new(self.activity)
|
146
|
+
layout_params = Android::Widget::LinearLayout::LayoutParams
|
147
|
+
aqv = create_android_query_view(view, style_method, layout_params, {})
|
148
|
+
self.stylesheet.apply_style_for(aqv, style_method, layout_params)
|
149
|
+
block.call(aqv) if block_given?
|
150
|
+
self.activity.setContentView(aqv.get)
|
151
|
+
end
|
152
|
+
|
153
|
+
def toast(text, options = {})
|
154
|
+
options = {
|
155
|
+
gravity: :bottom,
|
156
|
+
length: :short
|
157
|
+
}.merge(options)
|
158
|
+
|
159
|
+
gravity_options = {
|
160
|
+
top: Android::View::Gravity::TOP,
|
161
|
+
left: Android::View::Gravity::LEFT,
|
162
|
+
right: Android::View::Gravity::RIGHT,
|
163
|
+
bottom: Android::View::Gravity::BOTTOM,
|
164
|
+
center: Android::View::Gravity::CENTER,
|
165
|
+
bottom_right: Android::View::Gravity::BOTTOM | Android::View::Gravity::RIGHT,
|
166
|
+
bottom_left: Android::View::Gravity::BOTTOM | Android::View::Gravity::LEFT,
|
167
|
+
center_right: Android::View::Gravity::CENTER | Android::View::Gravity::RIGHT,
|
168
|
+
center_left: Android::View::Gravity::CENTER | Android::View::Gravity::LEFT,
|
169
|
+
top_right: Android::View::Gravity::TOP | Android::View::Gravity::RIGHT,
|
170
|
+
top_left: Android::View::Gravity::TOP | Android::View::Gravity::LEFT,
|
171
|
+
}
|
172
|
+
|
173
|
+
length_options = {
|
174
|
+
short: Android::Widget::Toast::LENGTH_SHORT,
|
175
|
+
long: Android::Widget::Toast::LENGTH_LONG,
|
176
|
+
}
|
177
|
+
|
178
|
+
the_toast = Android::Widget::Toast.makeText(self.activity, text, length_options[options[:length]])
|
179
|
+
the_toast.setGravity(gravity_options[options[:gravity]], 0, 0)
|
180
|
+
the_toast.show
|
181
|
+
end
|
182
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: android_query
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Abdullah Esmail
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
11
|
+
date: 2017-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -34,8 +34,8 @@ files:
|
|
34
34
|
- LICENSE.txt
|
35
35
|
- README.md
|
36
36
|
- lib/android_query.rb
|
37
|
-
- lib/android_query/android_query.rb
|
38
37
|
- lib/android_query/version.rb
|
38
|
+
- lib/android_query/views.rb
|
39
39
|
homepage: https://github.com/aesmail/android-query
|
40
40
|
licenses:
|
41
41
|
- MIT
|
@@ -1,178 +0,0 @@
|
|
1
|
-
class AndroidQuery
|
2
|
-
attr_accessor :activity
|
3
|
-
|
4
|
-
def initialize(source)
|
5
|
-
self.activity = source
|
6
|
-
end
|
7
|
-
|
8
|
-
def layout(layout_sym, options = {}, &block)
|
9
|
-
layout_info = get_layout(layout_sym, options)
|
10
|
-
my_layout = create_layout_with_params(layout_info, options)
|
11
|
-
block_layout = {
|
12
|
-
layout: my_layout,
|
13
|
-
layout_class: layout_info[:layout_class],
|
14
|
-
params_class: layout_info[:params_class],
|
15
|
-
layout_sym: layout_sym,
|
16
|
-
parent: layout_info[:parent],
|
17
|
-
}
|
18
|
-
block.call(block_layout)
|
19
|
-
block_layout[:parent][:layout].addView(my_layout) if block_layout[:parent]
|
20
|
-
set_content(block_layout) if block_layout[:parent].nil?
|
21
|
-
block_layout
|
22
|
-
end
|
23
|
-
|
24
|
-
def text_view(layout, options = {})
|
25
|
-
tv = Android::Widget::TextView.new(self.activity)
|
26
|
-
create_view_layout_params(tv, layout, options)
|
27
|
-
end
|
28
|
-
|
29
|
-
def edit_text(layout, options = {})
|
30
|
-
et = Android::Widget::EditText.new(self.activity)
|
31
|
-
create_view_layout_params(et, layout, options)
|
32
|
-
end
|
33
|
-
|
34
|
-
def button(layout, options = {})
|
35
|
-
btn = Android::Widget::Button.new(self.activity)
|
36
|
-
create_view_layout_params(btn, layout, options)
|
37
|
-
end
|
38
|
-
|
39
|
-
def set_content(layout, params = {})
|
40
|
-
self.activity.setContentView(layout[:layout])
|
41
|
-
end
|
42
|
-
|
43
|
-
def get_layout(layout, options)
|
44
|
-
options = merge_options(options)
|
45
|
-
layout_and_params = case layout
|
46
|
-
when :linear
|
47
|
-
[Android::Widget::LinearLayout, Android::Widget::LinearLayout::LayoutParams]
|
48
|
-
when :relative
|
49
|
-
[Android::Widget::RelativeLayout, Android::Widget::RelativeLayout::LayoutParams]
|
50
|
-
when :absolute
|
51
|
-
[Android::Widget::AbsoluteLayout, Android::Widget::AbsoluteLayout::LayoutParams]
|
52
|
-
else
|
53
|
-
layout
|
54
|
-
end
|
55
|
-
{
|
56
|
-
layout: nil,
|
57
|
-
layout_class: layout_and_params[0],
|
58
|
-
params_class: layout_and_params[1],
|
59
|
-
layout_sym: layout,
|
60
|
-
parent: options[:parent],
|
61
|
-
}
|
62
|
-
end
|
63
|
-
|
64
|
-
def merge_options(options)
|
65
|
-
{
|
66
|
-
w: :mp,
|
67
|
-
h: :wc,
|
68
|
-
orientation: :vertical,
|
69
|
-
weight: 0,
|
70
|
-
weight_sum: 0,
|
71
|
-
parent: nil,
|
72
|
-
click: nil,
|
73
|
-
id: nil,
|
74
|
-
}.merge(options)
|
75
|
-
end
|
76
|
-
|
77
|
-
def get_width(options, layout)
|
78
|
-
case options[:w]
|
79
|
-
when :mp, :match_parent
|
80
|
-
layout[:params_class]::MATCH_PARENT
|
81
|
-
when :wc, :wrap_content
|
82
|
-
layout[:params_class]::WRAP_CONTENT
|
83
|
-
else
|
84
|
-
options[:w]
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def get_height(options, layout)
|
89
|
-
case options[:h]
|
90
|
-
when :mp, :match_parent
|
91
|
-
layout[:params_class]::MATCH_PARENT
|
92
|
-
when :wc, :wrap_content
|
93
|
-
layout[:params_class]::WRAP_CONTENT
|
94
|
-
else
|
95
|
-
options[:h]
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def get_orientation(options, layout)
|
100
|
-
case options[:orientation]
|
101
|
-
when :vertical, :v
|
102
|
-
layout[:layout_class]::VERTICAL
|
103
|
-
when :horizontal, :h
|
104
|
-
layout[:layout_class]::HORIZONTAL
|
105
|
-
else
|
106
|
-
raise 'Please set either :horizontal or :vertical for the orientation'
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def create_layout_with_params(layout, options)
|
111
|
-
options = merge_options(options)
|
112
|
-
width = get_width(options, layout)
|
113
|
-
height = get_height(options, layout)
|
114
|
-
orientation = get_orientation(options, layout)
|
115
|
-
my_layout = layout[:layout_class].new(self.activity)
|
116
|
-
layout_params = layout[:params_class].new(width, height)
|
117
|
-
layout_params.weight = options[:weight] if layout[:layout_sym] == :linear
|
118
|
-
my_layout.setLayoutParams(layout_params)
|
119
|
-
my_layout.setOrientation(orientation) if layout[:layout_sym] == :linear
|
120
|
-
my_layout.setWeightSum(options[:weight_sum]) if layout[:layout_sym] == :linear
|
121
|
-
my_layout
|
122
|
-
end
|
123
|
-
|
124
|
-
def create_view_layout_params(view, layout, options)
|
125
|
-
options = merge_options(options)
|
126
|
-
width = get_width(options, layout)
|
127
|
-
height = get_height(options, layout)
|
128
|
-
layout_params = layout[:params_class].new(width, height)
|
129
|
-
layout_params.weight = options[:weight]
|
130
|
-
view.setText(options[:text]) unless options[:text].nil?
|
131
|
-
view.setLayoutParams(layout_params)
|
132
|
-
view.onClickListener = AQClickListener.new(self.activity, options) if options[:click]
|
133
|
-
view.setId(options[:id]) if options[:id]
|
134
|
-
layout[:layout].addView(view)
|
135
|
-
view
|
136
|
-
end
|
137
|
-
|
138
|
-
def find(view_id)
|
139
|
-
self.activity.findViewById(view_id)
|
140
|
-
end
|
141
|
-
|
142
|
-
def toast(text, options = {})
|
143
|
-
options = {
|
144
|
-
gravity: :bottom,
|
145
|
-
length: :short
|
146
|
-
}.merge(options)
|
147
|
-
|
148
|
-
gravity_options = {
|
149
|
-
top: Android::View::Gravity::TOP,
|
150
|
-
left: Android::View::Gravity::LEFT,
|
151
|
-
right: Android::View::Gravity::RIGHT,
|
152
|
-
bottom: Android::View::Gravity::BOTTOM,
|
153
|
-
center: Android::View::Gravity::CENTER,
|
154
|
-
}
|
155
|
-
|
156
|
-
length_options = {
|
157
|
-
short: Android::Widget::Toast::LENGTH_SHORT,
|
158
|
-
long: Android::Widget::Toast::LENGTH_LONG,
|
159
|
-
}
|
160
|
-
|
161
|
-
the_toast = Android::Widget::Toast.makeText(self.activity, text, length_options[options[:length]])
|
162
|
-
the_toast.setGravity(gravity_options[options[:gravity]], 0, 0)
|
163
|
-
the_toast.show
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
class AQClickListener
|
168
|
-
attr_accessor :activity, :options
|
169
|
-
|
170
|
-
def initialize(activity, options)
|
171
|
-
self.activity = activity
|
172
|
-
self.options = options
|
173
|
-
end
|
174
|
-
|
175
|
-
def onClick(view)
|
176
|
-
self.activity.send(self.options[:click], view)
|
177
|
-
end
|
178
|
-
end
|