Usability: State vs Verb

by Bob Kerns » Sat, 27 Feb 2010 06:11:30 GMT


Sponsored Links
 My business partner and I have a small disagreement, and I'm trying to
figure out the best way to resolve it.

First, I should say I started out his way, and switched after
reviewing a lot of applications.

The background is this -- we have an app, with some controls which can
be locked. A lock/unlock icon is put next to the lockable controls.
You can long-click the icon, and it brings up a context menu with
several items, including the item for the lock state.

Currently, it brings up a "Locked  [X]" or "Locked [ ]" item -- that
is, a menu item with a checkbox that can be checked or unchecked, and
the lock state is changed accordingly.

He would like me to change it to reflect the action being taken. I.e.
the menu item would say "Lock" if it is currently unlocked, and
"Unlock" if it is currently locked.

It would be acting as a toggle in either case; the only difference is
how it is presented to the user.

I see arguments both ways:

* Consistency with platform standards suggests the checkbox.
* This feels more active than the usual "change the state of a
preference flag".

Locking has implications beyond this application -- and is a major
motivation for the application, in fact.

Note that both he and I independently thought at first glance it
should be 'Lock/Unlock'. I need to weigh this apparent intuition
against platform-wide practice and user expectations.

Does anyone have any thoughts or opinions? Or alternatives I perhaps
haven't considered?

Thanks.

--



Usability: State vs Verb

by Nick Owens » Sat, 27 Feb 2010 06:16:44 GMT


 Bob:

The text next to the option should say "Locked" if locked and nothing if
otherwise.  A long-click should bring up the appropriate option for "Lock"
or "Unlock", depending on the current state.  Only one options needs to be
presented.  Present the state on the screen and the actions in the context -
in my experience, that has the most consistency across all software.

I think you're too deep into the analysis on this one and need to take a
step back - sometimes that happens when we stare at something too long.

Thanks,
Nick Owens
VP, ThreeClix
Office: (904) 429-7039
Mobile: (847) 565-9392
After Hours: (904) 540-5830


-----Original Message-----
From: android-developers@googlegroups.com
[mailto:android-develop...@googlegroups.com] On Behalf Of Bob Kerns
Sent: Friday, February 26, 2010 5:11 PM
To: Android Developers
Subject: [android-developers] Usability: State vs Verb

My business partner and I have a small disagreement, and I'm trying to
figure out the best way to resolve it.

First, I should say I started out his way, and switched after
reviewing a lot of applications.

The background is this -- we have an app, with some controls which can
be locked. A lock/unlock icon is put next to the lockable controls.
You can long-click the icon, and it brings up a context menu with
several items, including the item for the lock state.

Currently, it brings up a "Locked  [X]" or "Locked [ ]" item -- that
is, a menu item with a checkbox that can be checked or unchecked, and
the lock state is changed accordingly.

He would like me to change it to reflect the action being taken. I.e.
the menu item would say "Lock" if it is currently unlocked, and
"Unlock" if it is currently locked.

It would be acting as a toggle in either case; the only difference is
how it is presented to the user.

I see arguments both ways:

* Consistency with platform standards suggests the checkbox.
* This feels more active than the usual "change the state of a
preference flag".

Locking has implications beyond this application -- and is a major
motivation for the application, in fact.

Note that both he and I independently thought at first glance it
should be 'Lock/Unlock'. I need to weigh this apparent intuition
against platform-wide practice and user expectations.

Does anyone have any thoughts or opinions? Or alternatives I perhaps
haven't considered?

Thanks.

--


Sponsored Links


Usability: State vs Verb

by Mark Murphy » Sat, 27 Feb 2010 06:22:30 GMT


 


Six-guns at twenty paces.

Oh, wait, it's not that kind of disagreement. Never mind.

:-)


If the user sees the state on the main activity (via the icon), then I
would go with your business partner's argument -- make the context menu
be the verb. The state is represented in one place (screen) and the
change is represented in another (menu).

Though, to be honest, I'd seriously consider a ToggleButton rather than
an icon+context menu. Context menus are not discoverable, so you're
presumably relying on users to RTFM to find out how to lock/unlock...and
we all know how well RTFM works in practice. The only reason I'd "hide"
the lock/unlock operation in a context menu is if I were afraid of
accidental toggling, and that might even be better managed with a
confirmation AlertDialog or something.

And, of course, since I'm no usability guru, take my advice with a
suitably-sized grain of salt.

-- 
Mark Murphy (a Commons Guy)
 http://commonsware.com  |  http://twitter.com/commonsguy 

Android Development Wiki:  http://wiki.andmob.org 

--



Usability: State vs Verb

by Bob Kerns » Sat, 27 Feb 2010 06:28:50 GMT


 ?Huh? You're saying my menu option should be BLANK except for the
checkbox if not locked???

I'm sure I'm misreading you.

I do get your point about "present the state on the screen and the
actions in the context". That's a nice statement of the argument for
presenting the menu as a verb.

And I'm inclined to agree. It just feels like going against the
platform, and I'd like to understand why and when it's appropriate. I
do value consistency in UI.



>



Usability: State vs Verb

by Nick Owens » Sat, 27 Feb 2010 06:34:36 GMT


 ob:

So you have several rows on the page? Options, records, items, whatever
they are. To follow w/ typical usability, the minority state should be
shown next to the record and the majority (more frequent) state should be
removed, as it will be assumed.

As for indicating to the user that a long-click brings up a context menu,
that's a separate issue altogether and the word "Unlocked" doesn't help
either unless it says "Unlocked (press+hold to change)".

Thanks,
Nick Owens
VP, ThreeClix
Office: (904) 429-7039
Mobile: (847) 565-9392
After Hours: (904) 540-5830


-----Original Message-----
From: android-developers@googlegroups.com
[mailto:android-develop...@googlegroups.com] On Behalf Of Bob Kerns
Sent: Friday, February 26, 2010 5:29 PM
To: Android Developers
Subject: [android-developers] Re: Usability: State vs Verb

?Huh? You're saying my menu option should be BLANK except for the
checkbox if not locked???

I'm sure I'm misreading you.

I do get your point about "present the state on the screen and the
actions in the context". That's a nice statement of the argument for
presenting the menu as a verb.

And I'm inclined to agree. It just feels like going against the
platform, and I'd like to understand why and when it's appropriate. I
do value consistency in UI.

On Feb 26, 2:16pm, "Nick Owens" <nicow...@gmail.com> wrote:
-
>



Usability: State vs Verb

by Bob Kerns » Sat, 27 Feb 2010 06:41:57 GMT


 Thanks, Mark. (And Nick).

The lock icon is toggled with a simple click. The long press brings up
additional options, and the lock/unlock menu item is included for
consistency.

I actually DID hide it for a while, to prevent accidental activation.
That didn't work out so well, for the very reasons you state. I ended
up instead changing things so I could put in additional space, and
lower the risk of accidental activation.

Finally, first time in the app leads to a tutorial -- partly to
address issues like this.  Context menus are important here, because
one of the goals is to provide quick and easy access to the platform's
various options.

The other role for the tutorial is to explain the PLATFORM behavior --
and also to give the user the option to change some configuration
settings that might otherwise be confusing.

So anyway, I'm trying to make it usable. I don't have any problem with
changing it; I just don't want to change it without any idea of what
I'm doing.

Most of the functionality is available without the context menus.

Thanks, guys.






--



Usability: State vs Verb

by Bob Kerns » Sat, 27 Feb 2010 07:27:09 GMT


 ick,

There are several rows on the page. There's no clear majority or
minority of locked/unlocked states, and in fact, there's an option
menu to lock or unlock all of them.

There's no word "locked", just the usual padlock icon. There's not
enough space for that. The text is only on the context menu. But
interpreting your remarks assuming there were room, I agree, even if
it isn't a clear majority, "unlocked" would do more to obscure than
clarify in that case. As for the "press-and-hold" aspect -- tapping
works. I think I should make it more button-like, however.

But you've given me an idea. Currently, the unlocked icon is only
there to make it clear where to click to lock it. I also designed the
icon to blend into the background, so the more notable "locked" state
stands out. I have a second icon there as well that denotes one of
several states independent of the lock.

The context menu applies to them all. Actually, it would apply to the
entire row, but there are other usability issues with long presses in
that area, and I ended up having to disable it there.

I'm thinking that putting a sort of "icon tray" behind these
individual icons might help communicate that the long press is
available over the entire tray -- including the non-toggling icon,
even when that icon is absent. That is, it lets me present the larger
target for the long press.

Normally, I wouldn't overload things this way. I thought about
changing it for landscape mode, but that would give me two UI's which
would be a worse problem.

I'm also thinking about making it be a subscreen (drill-down) rather
than a context menu. It would still have the same active content, but
would give me a bit more control over presentation. Best of all, it
would be discoverable. Thanks, (Mark, too) for getting me to think
about that aspect again).

I seem to be getting broader useful input here (by implication) than I
was shooting for. I'm glad I thought to ask. Thanks, guys!

On Feb 26, 2:34pm, "Nick Owens" <nicow...@gmail.com> wrote:
> >



Other Threads

1. Build Android Problem(Labrador)

Hi all, i try to build android but i have trouble like that

r...@froodo:~/mydroid# TARGET_CPU_ABI=none TARGET_PRODUCT=ldp1 make -j2
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=1.6
TARGET_PRODUCT=ldp1
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=Donut
============================================
build/core/copy_headers.mk:15: warning: overriding commands for target
`out/target/product/ldp1/obj/include/libpv/getactualaacconfig.h'
build/core/copy_headers.mk:15: warning: ignoring old commands for
target `out/target/product/ldp1/obj/include/libpv/getactualaacconfig.h'
build/core/Makefile:17: warning: overriding commands for target
`out/target/product/ldp1/system/etc/apns-conf.xml'
build/core/Makefile:17: warning: ignoring old commands for target
`out/target/product/ldp1/system/etc/apns-conf.xml'
build/core/Makefile:17: warning: overriding commands for target
`out/target/product/ldp1/system/etc/vold.conf'
build/core/Makefile:17: warning: ignoring old commands for target
`out/target/product/ldp1/system/etc/vold.conf'
host Executable: acp (out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp)
true
host SharedLib: libneo_cs (out/host/linux-x86/obj/lib/libneo_cs.so)
host Executable: aapt
(out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt)
host SharedLib: libESR_Shared (out/host/linux-x86/obj/lib/libESR_Shared.so)
host Executable: apriori
(out/host/linux-x86/obj/EXECUTABLES/apriori_intermediates/apriori)
true
host Executable: bsdiff
(out/host/linux-x86/obj/EXECUTABLES/bsdiff_intermediates/bsdiff)
true
host Executable: bspatch
(out/host/linux-x86/obj/EXECUTABLES/bspatch_intermediates/bspatch)
true
host Executable: dexdump
(out/host/linux-x86/obj/EXECUTABLES/dexdump_intermediates/dexdump)
true
host Executable: dexlist
(out/host/linux-x86/obj/EXECUTABLES/dexlist_intermediates/dexlist)
true
host SharedLib: libhelium (out/host/linux-x86/obj/lib/libhelium.so)
true
host Executable: imgdiff
(out/host/linux-x86/obj/EXECUTABLES/imgdiff_intermediates/imgdiff)
true
target thumb C++: libandroid_runtime <=
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp
target thumb C: libssl <= external/openssl/ssl/s2_enc.c
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:39:
error: expected initializer before '*' token
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:45:
error: 'AGpsStatus' does not name a type
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:52:
error: 'AGpsStatus' does not name a type
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:99:
error: variable or field 'agps_status_callback' declared void
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:99:
error: 'AGpsStatus' was not declared in this scope
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:99:
error: 'agps_status' was not declared in this scope
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:129:
error: 'AGpsCallbacks' does not name a type
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp: In
function 'jboolean
android::android_location_GpsLocationProvider_init(JNIEnv*,
_jobject*)':
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:154:
error: 'sAGpsInterface' was not declared in this scope
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:155:
error: ISO C++ forbids declaration of 'type name' with no type
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:155:
error: ISO C++ forbids declaration of 'type name' with no type
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:155:
error: expected primary-expression before 'const'
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:155:
error: expected `)' before 'const'
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:156:
error: 'sAGpsInterface' was not declared in this scope
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:157:
error: 'sAGpsCallbacks' was not declared in this scope
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp: In
function 'void 
android::android_location_GpsLocationProvider_wait_for_event(JNIEnv*,
_jobject*)':
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:209:
error: 'sAGpsStatusCopy' was not declared in this scope
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:209:
error: 'sAGpsStatus' was not declared in this scope
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp: In
function 'void 
android::android_location_GpsLocationProvider_inject_location(JNIEnv*,
_jobject*, jdouble, jdouble, jfloat)':
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:276:
error: 'const struct GpsInterface' has no member named
'inject_location'
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp: In
function 'void 
android::android_location_GpsLocationProvider_agps_data_conn_open(JNIEnv*,
_jobject*, _jstring*)':
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:304:
error: 'sAGpsInterface' was not declared in this scope
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:305:
error: ISO C++ forbids declaration of 'type name' with no type
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:305:
error: ISO C++ forbids declaration of 'type name' with no type
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:305:
error: expected primary-expression before 'const'
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:305:
error: expected `)' before 'const'
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:307:
error: 'sAGpsInterface' was not declared in this scope
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp: In
function 'void 
android::android_location_GpsLocationProvider_agps_data_conn_closed(JNIEnv*,
_jobject*)':
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:320:
error: 'sAGpsInterface' was not declared in this scope
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:321:
error: ISO C++ forbids declaration of 'type name' with no type
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:321:
error: ISO C++ forbids declaration of 'type name' with no type
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:321:
error: expected primary-expression before 'const'
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:321:
error: expected `)' before 'const'
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:323:
error: 'sAGpsInterface' was not declared in this scope
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp: In
function 'void 
android::android_location_GpsLocationProvider_agps_data_conn_failed(JNIEnv*,
_jobject*)':
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:330:
error: 'sAGpsInterface' was not declared in this scope
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:331:
error: ISO C++ forbids declaration of 'type name' with no type
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:331:
error: ISO C++ forbids declaration of 'type name' with no type
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:331:
error: expected primary-expression before 'const'
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:331:
error: expected `)' before 'const'
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:333:
error: 'sAGpsInterface' was not declared in this scope
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp: In
function 'void 
android::android_location_GpsLocationProvider_set_agps_server(JNIEnv*,
_jobject*, jint, _jstring*, jint)':
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:341:
error: 'sAGpsInterface' was not declared in this scope
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:342:
error: ISO C++ forbids declaration of 'type name' with no type
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:342:
error: ISO C++ forbids declaration of 'type name' with no type
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:342:
error: expected primary-expression before 'const'
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:342:
error: expected `)' before 'const'
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:344:
error: 'sAGpsInterface' was not declared in this scope
make: *** 
[out/target/product/ldp1/obj/SHARED_LIBRARIES/libandroid_runtime_intermediates/android_location_GpsLocationProvider.o]
Error 1
make: ***  Waiting for unfinished jobs....

any idea?

best regards,
Aldyth M

--~--~---------~--~----~------------~-------~--~----~
unsubscribe: android-porting+unsubscr...@googlegroups.com
website: 

2. ignoring locked SD Card image (when starting emulator)

When I start the emulator from command line as below (on windows) I
get the following warnings.

C:\android-sdk-windows-1.5_r3\tools>emulator -sdcard D:\android-sdk-
windows-1.5_r3\tools\sd256m.img -skin HTC_HERO -avd my_avd

emulator: WARNING: ignoring locked SD Card image at D:\android-sdk-
windows-1.5_r3\tools\sd256m.img
emulator: WARNING:    4: key name doesn't start with valid character.
line ignored

Any idea why the SD card is being locked and how to unlock it? I get
the same warning even with a newly created SD card images (never used,
not used by any other emulator process or else), with all read/write
permissions, given.

Furthermore, I don't understand the meaning of the second warning
regarding invalid character. What's the "key name" ? I would've been
guessing it refers to the 4th parameter pair, but I'm only using 3
parameter pairs ?!

--~--~---------~--~----~------------~-------~--~----~

3. What am i missing here?

4. Unable to compile C application in Emulator

5. About ro.sf.lcd_density

6. How to find out whether the time format is 24-hour format ?

7. Porting to SH4