views:

1816

answers:

2

Can anyone tell me how to make hyperlink in blackberry.If u have any idea pls share with me.If u can provide some code snippet.

A: 

I don't think there is anything available, but you could extend LabelField and supply the needed functionality through overriding drawFocus, to change the hyper links color when focus is gained, and invokeAction, to perform the task required of the hyperlink.

Fostah
+5  A: 

Here's a custom label field that looks like a hyperlink, which can open a new screen. Let's call it SampleOpenScreenHyperLinkField and we'll add it as a context or full menu item too.

  • Create app entry point
  • Create sample screen and add the custom label field

First the entry point.

package sample;

import net.rim.device.api.ui.UiApplication;

/**
 * The entry point to application startup.
 */
public class SampleApp extends UiApplication {

    /**
     * The entry point.
     * 
     * @param args
     */
    public static void main(String[] args) {
        // Create a new instance of the application
        // and start the application on an event thread
        SampleApp app = new SampleApp();

        app.enterEventDispatcher();
    }

    /**
     * Basic constructor.
     */
    public SampleApp() {
        UiApplication.getUiApplication().pushScreen(new SampleScreen(1));
    }
}

Next, your sample screen.

package sample;

import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.component.RichTextField;
import net.rim.device.api.ui.container.MainScreen;

public class SampleScreen extends MainScreen {


    public SampleScreen(int screenNumber) {

        super(Manager.NO_VERTICAL_SCROLL | Manager.NO_VERTICAL_SCROLLBAR);
        this.add(new RichTextField("Screen " + screenNumber));
        int nextScreenNumber = screenNumber +1; 
        this.add(new SampleOpenScreenHyperLinkField("Screen " + nextScreenNumber, nextScreenNumber));
    }
}

Now, for your custom label field.

package sample;
import net.rim.device.api.ui.ContextMenu;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.FontFamily;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.LabelField;

/**
 * 
 * @author chad.lafontaine
 *
 */
public class SampleOpenScreenHyperLinkField extends LabelField {

    private int pageCount = -1;
    private MenuItem mGetLinkMenuItem;
    /**
     * 
     * @param hyperlinkLabel - label to display link
     */    
    public SampleOpenScreenHyperLinkField(String hyperlinkLabel, int pageCount) {
        super(hyperlinkLabel, FOCUSABLE);
        this.pageCount = pageCount;
        Font font = getBasefontSize(10);
        setFont(font.derive(Font.UNDERLINED | Font.PLAIN));
        mGetLinkMenuItem = new SampleOpenScreenMenuItem(hyperlinkLabel);
    }

    /**
     * Context menu
     */
    public ContextMenu getContextMenu() {
        // Add our "Get Link" menu item to the context menu
        ContextMenu menu = super.getContextMenu();
        menu.addItem(mGetLinkMenuItem);
        return menu;
    }

    /**
     * Inner class 
     */
    class SampleOpenScreenMenuItem extends MenuItem {

        public SampleOpenScreenMenuItem(String menuLabel) {
            super(menuLabel, 0, 100);
        }

        public void run() {
            UiApplication.getUiApplication().pushScreen(new SampleScreen(pageCount));

        }

    }

    /**
     * Base font of the application. Method is static for other UI components to
     * call for calculation of display fields.
     * 
     * @return
     */
    public static Font getBasefontSize(int size) {
        Font baseFont = null;
        try {
            baseFont = FontFamily.forName("BBClarity").getFont(FontFamily.SCALABLE_FONT, size);
        } catch (ClassNotFoundException e) {
            baseFont = Font.getDefault().getFontFamily().getFont(FontFamily.SCALABLE_FONT, size);
        }

        return baseFont;
    }
}

Result: you should have a screen with a 'hyperlink' leading to another screen. What if you want to invoke a browser instead? You can use the following class for that.

package sample;

import net.rim.blackberry.api.browser.Browser;
import net.rim.device.api.ui.ContextMenu;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.FontFamily;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.component.LabelField;

/**
 * Custom action label to invoke a browser given a URL.
 */
public class InvokeBrowserHyperlinkField extends LabelField {
    private String mUrl;
    private MenuItem mGetLinkMenuItem;

    /**
     * Constructs a new HyperlinkField instance with provided label, style and
     * URL
     * 
     * @param label
     *            Label string to be displayed.
     * @param style
     *            Field style for the label.
     * @param url
     *            URL to be opened in the browser.
     */
    public InvokeBrowserHyperlinkField(String label, long style, String url) {
        super(label, style | FOCUSABLE);

        setFont(Font.getDefault().getFontFamily().getFont(FontFamily.SCALABLE_FONT, 10));

        mUrl = url;

        mGetLinkMenuItem = new MenuItem("Get Link", 0, 0) {
            public void run() {
                // invoke browser with URL
                Browser.getDefaultSession().displayPage(mUrl);
            }
        };
    }

    /**
     * Constructs a new HyperlinkField instance with provided label and url with
     * default style
     * 
     * @param label
     *            Label string to be displayed.
     * @param url
     *            URL to be opened in the browser.
     */
    public InvokeBrowserHyperlinkField(String label, String url) {
        this(label, 0, url);
    }

    public ContextMenu getContextMenu() {
        // Add our "Get Link" menu item to the context menu
        ContextMenu menu = super.getContextMenu();
        menu.addItem(mGetLinkMenuItem);
        return menu;
    }
}

Result: clicking on the link or menu item, should invoke the device browser to the desired URL.

clafonta