Best practices for integrated (context-sensitive) help?

by Nathan » Fri, 23 Apr 2010 00:56:53 GMT


Sponsored Links
 What are the best practices people have used to integrate help/tips in
their application?

One way I can think of is having html snippets in resources or assets
- perhaps as html files - maybe as formatted strings. However, I think
it would break down once an html file linked to another html file or
an image or icon.

I'm sure some of you have apps that are so wonderfully intuitive that
they don't need any help.  And I admire that. But I'm not making that
assumption for my app.

Thanks for any tips.

Nathan

--



Best practices for integrated (context-sensitive) help?

by Nathan » Fri, 23 Apr 2010 04:57:33 GMT


 No ideas? I thought someone would have done this by now.

I've tried searching but the word 'help' is so common that a search
didn't help much.


Nathan



>


Sponsored Links


Best practices for integrated (context-sensitive) help?

by krox » Fri, 23 Apr 2010 05:10:06 GMT


 Hi!

Good question, haven't really thought about it earlier but my approach
would probably be to have small buttons with a question-mark icon and
when clicked a Toast-message would display. Or perhaps using a
(Alert)Dialog instead of a Toast if a more advanced help-message is to
be displayed.

/Erik




> >



Best practices for integrated (context-sensitive) help?

by ~ TreKing » Fri, 23 Apr 2010 07:11:17 GMT


 




Please wait more than 4 hours before bumping your own thread - especially in
the middle of a work day - as many people won't have a chance to even look
at it let alone have the time to respond that quickly.

-------------------------------------------------------------------------------------------------
TreKing - Chicago transit tracking app for Android-powered devices
 http://sites.google.com/site/rezmobileapps/treking 

--



Best practices for integrated (context-sensitive) help?

by Michael Thomas » Fri, 23 Apr 2010 07:19:30 GMT


 

One way I can think of is having html snippets in resources or assets - perhaps as html files - maybe as formatted strings.
This sounds lovely. Or, just host the help online, linking to it via an ACTION_VIEW Intent on your URL. I'm not sure if the HTML5 offline stuff works with the Android browser, but if it does, use that to allow your help to be usable even when there's no connection. IMHO, this will be the long-term direction for this sort of thing, as it gives you easy publishing, easy updates independent of the app itself, yet still isn't completely busted when the user is offline.
Something that I've done is bundled stuff together as a web widget, and use that to drastically cut down on load times -- it's not for offline use, but the idea is the same. One thing that might be helpful with my approach was that I just to built the pages under a normal web server and maintain them that way. I then just use wget with some of its nice archiving facilities to suck them all back in, and zip the proceeds. If you need to maintain it as a web accessible site too, it's a big win since there's essentially only one "source tree". Works great for css and js and sprites too (which was really my big motivation) . Mike
Or, write your help in the form of an EPUB document and make it available, so those with an EPUB reader (e.g., FBReaderJ) can use it. Or, write your help in the form of a PDF document and make it available, so those with a PDF viewer (e.g., Documents To Go) can use it. And see if they have a referral program for sales, so you can make a bit of money on people who buy that app to view your help. Or, don't worry about on-device help due to form-factor issues and just provide support via your Web site.
However, I think it would break down once an html file linked to another html file or an image or icon.
Worst-case scenario: create a content provider to serve your help files.
--



Other Threads

1. WebView Catch 22 - Same Window, Except For New Domain

I like this tutorial...
 http://www.***.com/ 

...but it doesn't explain how to handle new windows.

It says, "What we've done is create a WebViewClient that will load any
URL selected in our WebView in the same WebView."

...but what if you don't want "ANY" URL, only URL's from your domain.
Say some clicks an adverti{*filter*}t, or a link to another website, do we
really want the user stuck in someone's app?

So this is the line of code...
webview.setWebViewClient(new WebViewClientDemo());

...and I went here...
 http://www.***.com/ 

...but I didn't see how it would be possible to distinguish between my
domain and other domains. Is this a limitation of Android's WebKit?
--~--~---------~--~----~------------~-------~--~----~

2. Retreiving Preferences

I am using a CountDownTimer which is set by a alarm_delay_keys value:

public void arming() {
        // changing system_state textview
        tvSystemState = (TextView) findViewById(R.id.system_state);
        tvSystemState.setText(R.string.system_state_arming);
        // starting countdown
        settings = getPrefs();
        seconds = Integer.parseInt(settings.getString("alarm_delay_keys",
"30"));
        alarmDelay = seconds * 1000;
        CountDown counter = new CountDown(alarmDelay,1000);
        counter.start();
}

public SharedPreferences getPrefs() {
//      PreferenceManager pm = pa.getPreferenceManager();
//      settings = pm.getSharedPreferences();
//      settings = this.getPreferences(0);
//      settings = PreferenceManager.getDefaultSharedPreferences(this);
        settings = PreferenceManager.getDefaultSharedPreferences
(getBaseContext());
        return settings;
}

public class CountDown extends CountDownTimer {
        private TextView tvCountDown = (TextView) findViewById
(R.id.progress);
        private TextView tvSystemState = (TextView) findViewById
(R.id.system_state);

        public CountDown(long millisInFuture, long countDownInterval) {
                super(millisInFuture, countDownInterval);
        }

        @Override
        public void onFinish() {
        tvSystemState.setText(R.string.system_state_armed);
        tvCountDown.setText(R.string.armed);
        }

        @Override
        public void onTick(long millisUntilFinished) {
                tvCountDown.setText(millisUntilFinished/1000 + " seconds until
Armed");

        }

Here's a snippet of the res/values/arrays.xml:

        <string-array name="alarm_delay_keys">
                <item>15 seconds</item>
                <item>30 seconds</item>
                <item>1 minute</item>
                <item>5 minutes</item>
                <item>15 minutes</item>
        </string-array>
        <string-array name="alarm_delay_values">
                <item>15</item>
                <item>30</item>
                <item>60</item>
                <item>300</item>
                <item>900</item>
        </string-array>

and the snippet from res/xml/preferences.xml:

                <ListPreference
                        android:key="alarm_delay_list"
                        android:title="Alarm Delay"
                        android:summary="Click to change the alarm delay"
                        android:entries="@array/alarm_delay_keys"
                        android:entryValues="@array/alarm_delay_values"
                        android:dialogTitle="Choose your alarm delay\n(default 
is 1
minute)"
                        android:defaultValue="60"
                />

If I change the value in the options menu, the radio gets set to the
correct value. The timer works, but keeps using the default value of
30 no matter what I set the value to in the options menu.

I assume this means I am not retreiving the preferences, since the
default value is set at:
        seconds = Integer.parseInt(settings.getString("alarm_delay_keys",
"30"));

As you can see above, I tried several variations for calling
PreferenceManager, but these did not make a difference.

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

3. Communication over USB with Program on Computer

4. build android-msm-2.6.27 and met an error

5. possible leak in orientation change?

6. Virtual keyboard obscures EditText

7. ArrayAdapter.add() within a TimerTask