2016-10-03 73 views

回答

2

更改媒體控制器以提供靜音/取消靜音或快進的選項。將這些視圖(按鈕)添加到控制器的視圖中,然後爲此定製媒體控制器。檢查這也Custom Media Controller

VideoControllerView

public class VideoControllerView extends FrameLayout { 
private static final String TAG = "VideoControllerView"; 

private MediaPlayerControl mPlayer; 
private Context mContext; 
private ViewGroup mAnchor; 
private View mRoot; 
private ProgressBar mProgress; 
private TextView mEndTime, mCurrentTime; 
private boolean mShowing; 
private boolean mDragging; 
private static final int sDefaultTimeout = 3000; 
private static final int FADE_OUT = 1; 
private static final int SHOW_PROGRESS = 2; 
private boolean mUseFastForward; 
private boolean mFromXml; 
private boolean mListenersSet; 
private OnClickListener mNextListener; 
StringBuilder mFormatBuilder; 
Formatter mFormatter; 
private ImageButton mPauseButton; 
private ImageButton mVolumeButton; 
private ImageButton mRewButton; 
private ImageButton mSettingButton; 
private Button mQualityButton; 
private ImageButton mFullscreenButton; 
private Handler mHandler = new MessageHandler(this); 
private SeekBar seekbar; 
private AudioManager audioManager; 
private TextView txtVolume; 

public VideoControllerView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mRoot = null; 
    mContext = context; 
    mUseFastForward = true; 
    mFromXml = true; 

    Log.i(TAG, TAG); 
} 

public VideoControllerView(Context context, boolean useFastForward) { 
    super(context); 
    mContext = context; 
    mUseFastForward = useFastForward; 

    Log.i(TAG, TAG); 
} 

public VideoControllerView(Context context) { 
    this(context, true); 

    Log.i(TAG, TAG); 
} 

@SuppressLint("MissingSuperCall") 
@Override 
public void onFinishInflate() { 
    if (mRoot != null) 
     initControllerView(mRoot); 
} 

public void setMediaPlayer(MediaPlayerControl player) { 
    mPlayer = player; 
    updatePausePlay(); 
    updateFullScreen(false); 
} 

/** 
* Set the view that acts as the anchor for the control view. 
* This can for example be a VideoView, or your Activity's main view. 
* 
* @param view The view to which to anchor the controller when it is visible. 
*/ 
public void setAnchorView(ViewGroup view) { 
    mAnchor = view; 

    LayoutParams frameParams = new LayoutParams(
      ViewGroup.LayoutParams.MATCH_PARENT, 
      ViewGroup.LayoutParams.MATCH_PARENT 
    ); 

    removeAllViews(); 
    View v = makeControllerView(); 
    addView(v, frameParams); 
} 

/** 
* Create the view that holds the widgets that control playback. 
* Derived classes can override this to create their own. 
* 
* @return The controller view. 
* @hide This doesn't work as advertised 
*/ 
protected View makeControllerView() { 
    LayoutInflater inflate = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mRoot = inflate.inflate(R.layout.custom_media_controller, null); 

    initControllerView(mRoot); 

    return mRoot; 
} 

@SuppressLint("WrongViewCast") 
private void initControllerView(View v) { 
    mPauseButton = (ImageButton) v.findViewById(R.id.pause); 
    if (mPauseButton != null) { 
     mPauseButton.requestFocus(); 
     mPauseButton.setOnClickListener(mPauseListener); 
    } 

    mFullscreenButton = (ImageButton) v.findViewById(R.id.fullscreen); 
    if (mFullscreenButton != null) { 
     mFullscreenButton.requestFocus(); 
     mFullscreenButton.setOnClickListener(mFullscreenListener); 
    } 

    mVolumeButton = (ImageButton) v.findViewById(R.id.volume); 
    if (mVolumeButton != null) { 
     mVolumeButton.setOnClickListener(mVolumeListener); 
     if (!mFromXml) { 
      //mVolumeButton.setVisibility(mUseFastForward ? View.VISIBLE : View.GONE); 
     } 
    } 

    mRewButton = (ImageButton) v.findViewById(R.id.rew); 
    if (mRewButton != null) { 
     mRewButton.setOnClickListener(mRewListener); 
     if (!mFromXml) { 
      mRewButton.setVisibility(mUseFastForward ? View.VISIBLE : View.GONE); 
     } 
    } 

    // By default these are hidden. They will be enabled when setPrevNextListeners() is called 
    mSettingButton = (ImageButton) v.findViewById(R.id.settings); 
    if (mSettingButton != null && !mFromXml && !mListenersSet) { 
     // mSettingButton.setVisibility(View.GONE); 
    } 
    mQualityButton = (Button) v.findViewById(R.id.quality); 
    if (mQualityButton != null && !mFromXml && !mListenersSet) { 
     //mQualityButton.setVisibility(View.GONE); 
    } 

    mProgress = (ProgressBar) v.findViewById(R.id.mediacontroller_progress); 
    if (mProgress != null) { 
     if (mProgress instanceof SeekBar) { 
      SeekBar seeker = (SeekBar) mProgress; 
      seeker.setOnSeekBarChangeListener(mSeekListener); 
     } 
     mProgress.setMax(1000); 
    } 

    mEndTime = (TextView) v.findViewById(R.id.time); 
    mCurrentTime = (TextView) v.findViewById(R.id.time_current); 
    mFormatBuilder = new StringBuilder(); 
    mFormatter = new Formatter(mFormatBuilder, Locale.getDefault()); 

    installPrevNextListeners(); 
} 

/** 
* Show the controller on screen. It will go away 
* automatically after 3 seconds of inactivity. 
*/ 
public void show() { 
    show(sDefaultTimeout); 
} 

/** 
* Disable pause or seek buttons if the stream cannot be paused or seeked. 
* This requires the control interface to be a MediaPlayerControlExt 
*/ 
private void disableUnsupportedButtons() { 
    if (mPlayer == null) { 
     return; 
    } 

    try { 
     if (mPauseButton != null && !mPlayer.canPause()) { 
      mPauseButton.setEnabled(false); 
     } 
     if (mRewButton != null && !mPlayer.canSeekBackward()) { 
      mRewButton.setEnabled(false); 
     } 
     if (mVolumeButton != null && !mPlayer.canSeekForward()) { 
      mVolumeButton.setEnabled(false); 
     } 
    } catch (IncompatibleClassChangeError ex) { 
     // We were given an old version of the interface, that doesn't have 
     // the canPause/canSeekXYZ methods. This is OK, it just means we 
     // assume the media can be paused and seeked, and so we don't disable 
     // the buttons. 
    } 
} 

/** 
* Show the controller on screen. It will go away 
* automatically after 'timeout' milliseconds of inactivity. 
* 
* @param timeout The timeout in milliseconds. Use 0 to show 
*    the controller until hide() is called. 
*/ 
public void show(int timeout) { 
    if (!mShowing && mAnchor != null) { 
     setProgress(); 
     if (mPauseButton != null) { 
      mPauseButton.requestFocus(); 
     } 
     disableUnsupportedButtons(); 

     LayoutParams tlp = new LayoutParams(
       ViewGroup.LayoutParams.MATCH_PARENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT, 
       Gravity.BOTTOM 
     ); 

     mAnchor.addView(this, tlp); 
     mShowing = true; 
    } 
    updatePausePlay(); 

    // cause the progress bar to be updated even if mShowing 
    // was already true. This happens, for example, if we're 
    // paused with the progress bar showing the user hits play. 
    mHandler.sendEmptyMessage(SHOW_PROGRESS); 

    Message msg = mHandler.obtainMessage(FADE_OUT); 
    if (timeout != 0) { 
     mHandler.removeMessages(FADE_OUT); 
     mHandler.sendMessageDelayed(msg, timeout); 
    } 
} 

public boolean isShowing() { 
    return mShowing; 
} 

/** 
* Remove the controller from the screen. 
*/ 
public void hide() { 
    if (mAnchor == null) { 
     return; 
    } 
    try { 
     mAnchor.removeView(this); 
     mHandler.removeMessages(SHOW_PROGRESS); 
    } catch (IllegalArgumentException ex) { 
     Log.w("MediaController", "already removed"); 
    } 
    mShowing = false; 
} 

private String stringForTime(int timeMs) { 
    int totalSeconds = timeMs/1000; 

    int seconds = totalSeconds % 60; 
    int minutes = (totalSeconds/60) % 60; 
    int hours = totalSeconds/3600; 

    mFormatBuilder.setLength(0); 
    if (hours > 0) { 
     return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString(); 
    } else { 
     return mFormatter.format("%02d:%02d", minutes, seconds).toString(); 
    } 
} 

private int setProgress() { 
    if (mPlayer == null || mDragging) { 
     return 0; 
    } 

    int position = mPlayer.getCurrentPosition(); 
    int duration = mPlayer.getDuration(); 
    //Log.d(TAG, "Duration->" + duration); 
    //Log.d(TAG, "Duration Current->" + position); 
    if (mProgress != null) { 
     if (duration > 0) { 
      // use long to avoid overflow 
      long pos = 1000L * position/duration; 
      mProgress.setProgress((int) pos); 
     } 
     int percent = mPlayer.getBufferPercentage(); 
     mProgress.setSecondaryProgress(percent * 10); 
    } 

    if (mEndTime != null) 
     mEndTime.setText(stringForTime(duration)); 
    if (mCurrentTime != null) 
     mCurrentTime.setText(stringForTime(position)); 

    return position; 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    show(sDefaultTimeout); 
    return true; 
} 

@Override 
public boolean onTrackballEvent(MotionEvent ev) { 
    show(sDefaultTimeout); 
    return false; 
} 

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    if (mPlayer == null) { 
     return true; 
    } 

    int keyCode = event.getKeyCode(); 
    final boolean uniqueDown = event.getRepeatCount() == 0 
      && event.getAction() == KeyEvent.ACTION_DOWN; 
    if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK 
      || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE 
      || keyCode == KeyEvent.KEYCODE_SPACE) { 
     if (uniqueDown) { 
      doPauseResume(); 
      show(sDefaultTimeout); 
      if (mPauseButton != null) { 
       mPauseButton.requestFocus(); 
      } 
     } 
     return true; 
    } else if (keyCode == KeyEvent.KEYCODE_MEDIA_PLAY) { 
     if (uniqueDown && !mPlayer.isPlaying()) { 
      mPlayer.start(); 
      updatePausePlay(); 
      show(sDefaultTimeout); 
     } 
     return true; 
    } else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP 
      || keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE) { 
     if (uniqueDown && mPlayer.isPlaying()) { 
      mPlayer.pause(); 
      updatePausePlay(); 
      show(sDefaultTimeout); 
     } 
     return true; 
    } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN 
      || keyCode == KeyEvent.KEYCODE_VOLUME_UP 
      || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE) { 
     // don't show the controls for volume adjustment 
     return super.dispatchKeyEvent(event); 
    } else if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU) { 
     if (uniqueDown) { 
      hide(); 
     } 
     return true; 
    } 

    show(sDefaultTimeout); 
    return super.dispatchKeyEvent(event); 
} 

private OnClickListener mPauseListener = new OnClickListener() { 
    public void onClick(View v) { 
     doPauseResume(); 
     show(sDefaultTimeout); 
    } 
}; 

private OnClickListener mQualityChangeListener = new OnClickListener() { 
    public void onClick(View v) { 
     mPlayer.updateVideoQuality(); 
    } 
}; 
private OnClickListener mFullscreenListener = new OnClickListener() { 
    public void onClick(View v) { 
     doToggleFullscreen(); 
     show(sDefaultTimeout); 
    } 
}; 

public void updatePausePlay() { 
    if (mRoot == null || mPauseButton == null || mPlayer == null) { 
     return; 
    } 

    if (mPlayer.isPlaying()) { 
     mPauseButton.setImageResource(R.drawable.ic_pause); 
    } else { 
     mPauseButton.setImageResource(R.drawable.ic_play); 
    } 
} 

public void updateFullScreen(boolean isFullScreen) { 
    if (mRoot == null || mFullscreenButton == null || mPlayer == null) { 
     return; 
    } 

    if (isFullScreen) { 
     mFullscreenButton.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_unstretch)); 
    } else { 
     mFullscreenButton.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_stretch)); 
    } 
} 

private void doPauseResume() { 
    if (mPlayer == null) { 
     return; 
    } 

    if (mPlayer.isPlaying()) { 
     mPlayer.pause(); 
    } else { 
     mPlayer.start(); 
    } 
    updatePausePlay(); 
} 

private void doToggleFullscreen() { 
    if (mPlayer == null) { 
     return; 
    } 
    if (mPlayer.isFullScreen()) { 
     mFullscreenButton.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_unstretch)); 
    } else { 
     mFullscreenButton.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_stretch)); 
    } 
    mPlayer.toggleFullScreen(); 

} 

// There are two scenarios that can trigger the seekbar listener to trigger: 
// 
// The first is the user using the touchpad to adjust the posititon of the 
// seekbar's thumb. In this case onStartTrackingTouch is called followed by 
// a number of onProgressChanged notifications, concluded by onStopTrackingTouch. 
// We're setting the field "mDragging" to true for the duration of the dragging 
// session to avoid jumps in the position in case of ongoing playback. 
// 
// The second scenario involves the user operating the scroll ball, in this 
// case there WON'T BE onStartTrackingTouch/onStopTrackingTouch notifications, 
// we will simply apply the updated position without suspending regular updates. 
private OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() { 
    public void onStartTrackingTouch(SeekBar bar) { 
     show(3600000); 

     mDragging = true; 

     // By removing these pending progress messages we make sure 
     // that a) we won't update the progress while the user adjusts 
     // the seekbar and b) once the user is done dragging the thumb 
     // we will post one of these messages to the queue again and 
     // this ensures that there will be exactly one message queued up. 
     mHandler.removeMessages(SHOW_PROGRESS); 
    } 

    public void onProgressChanged(SeekBar bar, int progress, boolean fromuser) { 
     if (mPlayer == null) { 
      return; 
     } 

     if (!fromuser) { 
      // We're not interested in programmatically generated changes to 
      // the progress bar's position. 
      return; 
     } 

     long duration = mPlayer.getDuration(); 
     long newposition = (duration * progress)/1000L; 
     mPlayer.seekTo((int) newposition); 
     if (mCurrentTime != null) 
      mCurrentTime.setText(stringForTime((int) newposition)); 
    } 

    public void onStopTrackingTouch(SeekBar bar) { 
     mDragging = false; 
     setProgress(); 
     updatePausePlay(); 
     show(sDefaultTimeout); 

     // Ensure that progress is properly updated in the future, 
     // the call to show() does not guarantee this because it is a 
     // no-op if we are already showing. 
     mHandler.sendEmptyMessage(SHOW_PROGRESS); 
    } 
}; 

@Override 
public void setEnabled(boolean enabled) { 
    if (mPauseButton != null) { 
     mPauseButton.setEnabled(enabled); 
    } 
    if (mVolumeButton != null) { 
     mVolumeButton.setEnabled(enabled); 
    } 
    if (mRewButton != null) { 
     mRewButton.setEnabled(enabled); 
    } 
    if (mSettingButton != null) { 
     mSettingButton.setEnabled(enabled && mNextListener != null); 
    } 
    if (mQualityButton != null) { 
     mQualityButton.setEnabled(enabled && mQualityChangeListener != null); 
    } 
    if (mProgress != null) { 
     mProgress.setEnabled(enabled); 
    } 
    disableUnsupportedButtons(); 
    super.setEnabled(enabled); 
} 

private OnClickListener mRewListener = new OnClickListener() { 
    public void onClick(View v) { 
     if (mPlayer == null) { 
      return; 
     } 

     int pos = mPlayer.getCurrentPosition(); 
     pos -= 15000; // milliseconds 
     mPlayer.seekTo(pos); 
     setProgress(); 

     show(sDefaultTimeout); 
    } 
}; 

private OnClickListener mVolumeListener = new OnClickListener() { 
    public void onClick(View v) { 
     if (mPlayer == null) { 
      return; 
     } 
     showPopup(mContext); 
    } 
}; 

private void installPrevNextListeners() { 
    if (mSettingButton != null) { 
     mSettingButton.setOnClickListener(mNextListener); 
     mSettingButton.setEnabled(mNextListener != null); 
    } 

    if (mQualityButton != null) { 
     mQualityButton.setOnClickListener(mQualityChangeListener); 
     mQualityButton.setEnabled(mQualityChangeListener != null); 
    } 
} 

public void setPrevNextListeners(OnClickListener next, OnClickListener prev) { 
    mNextListener = next; 
    mQualityChangeListener = prev; 
    mListenersSet = true; 

    if (mRoot != null) { 
     installPrevNextListeners(); 

     if (mSettingButton != null && !mFromXml) { 
      mSettingButton.setVisibility(View.VISIBLE); 
     } 
     if (mQualityButton != null && !mFromXml) { 
      mQualityButton.setVisibility(View.VISIBLE); 
     } 
    } 
} 

public interface MediaPlayerControl { 
    void start(); 

    void pause(); 

    int getDuration(); 

    int getCurrentPosition(); 

    void seekTo(int pos); 

    boolean isPlaying(); 

    int getAudioSessionId(); 

    int getBufferPercentage(); 

    boolean canPause(); 

    boolean canSeekBackward(); 

    boolean canSeekForward(); 

    boolean isFullScreen(); 

    void toggleFullScreen(); 

    void updateVideoQuality(); 
} 

private static class MessageHandler extends Handler { 
    private final WeakReference<VideoControllerView> mView; 

    MessageHandler(VideoControllerView view) { 
     mView = new WeakReference<VideoControllerView>(view); 
    } 

    @Override 
    public void handleMessage(Message msg) { 
     VideoControllerView view = mView.get(); 
     if (view == null || view.mPlayer == null) { 
      return; 
     } 
     int pos; 
     switch (msg.what) { 
      case FADE_OUT: 
       view.hide(); 
       break; 
      case SHOW_PROGRESS: 
       pos = view.setProgress(); 
       if (!view.mDragging && view.mShowing && view.mPlayer.isPlaying()) { 
        msg = obtainMessage(SHOW_PROGRESS); 
        sendMessageDelayed(msg, 1000 - (pos % 1000)); 
       } 
       break; 
     } 
    } 
} 

// The method that displays the popup. 
private void showPopup(final Context context) { 
    final Dialog dialog = new Dialog(context, 
      android.R.style.Theme_Translucent_NoTitleBar); 

    // Inflate the popup_layout.xml 
    LinearLayout viewGroup = (LinearLayout) findViewById(R.id.popup); 
    LayoutInflater layoutInflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View layout = layoutInflater.inflate(R.layout.popup_volumebar, viewGroup); 
    seekbar = (SeekBar) layout.findViewById(R.id.seekBar1); 
    txtVolume = (TextView) layout.findViewById(R.id.txtPopupVolume); 
    // Setting dialogview 
    Window window = dialog.getWindow(); 
    window.setGravity(Gravity.CENTER | Gravity.END); 

    window.setLayout(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    dialog.setTitle(null); 
    dialog.setCanceledOnTouchOutside(true); 
    dialog.setContentView(layout); 
    dialog.setCancelable(true); 
    dialog.show(); 
    initControls(); 
} 

private void initControls() { 
    try { 
     audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 
     seekbar.setMax(audioManager 
       .getStreamMaxVolume(AudioManager.STREAM_MUSIC)); 
     seekbar.setProgress(audioManager 
       .getStreamVolume(AudioManager.STREAM_MUSIC)); 
     txtVolume.setText("" + audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)); 

     seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onStopTrackingTouch(SeekBar arg0) { 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar arg0) { 
      } 

      @Override 
      public void onProgressChanged(SeekBar arg0, int progress, boolean arg2) { 
       audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 
         progress, 0); 
       txtVolume.setText("" + progress); 
      } 
     }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

和custom_media_controller.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_gravity="center_horizontal" 
android:background="@color/TvControllerBackground" 
android:gravity="center_horizontal" 
android:orientation="vertical"> 

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:orientation="horizontal" 
    android:paddingTop="4dip"> 

    <Button 
     android:id="@+id/quality" 
     style="@style/MediaButton.Previous" 
     android:background="@null" 
     android:contentDescription="@string/description" 
     android:paddingLeft="@dimen/size_5" 
     android:paddingRight="@dimen/size_5" 
     android:text="@string/hd" 
     android:textColor="@color/white" 
     android:textStyle="bold" 
     android:visibility="gone" /> 

    <ImageButton 
     android:id="@+id/rew" 
     style="@style/MediaButton.Rew" 
     android:contentDescription="@string/description" 
     android:visibility="gone" /> 

    <ImageButton 
     android:id="@+id/pause" 
     style="@style/MediaButton.Play" 
     android:contentDescription="@string/description" /> 

    <ImageButton 
     android:id="@+id/volume" 
     style="@style/MediaButton.Ffwd" 
     android:contentDescription="@string/description" /> 

    <ImageButton 
     android:id="@+id/settings" 
     style="@style/MediaButton.Setting" 
     android:contentDescription="@string/description" 
     android:visibility="gone" /> 

    <ImageButton 
     android:id="@+id/fullscreen" 
     style="@style/MediaButton.FullScreen" 
     android:contentDescription="@string/description" 
     android:visibility="visible" /> 

</LinearLayout> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:gravity="center_horizontal" 
    android:orientation="horizontal" 
    android:paddingBottom="@dimen/size_5"> 

    <TextView 
     android:id="@+id/time_current" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:paddingLeft="4dip" 
     android:paddingRight="4dip" 
     android:paddingTop="4dip" 
     android:textSize="14sp" 
     android:textStyle="bold" /> 

    <SeekBar 
     android:id="@+id/mediacontroller_progress" 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_width="0dip" 
     android:layout_height="32dip" 
     android:layout_gravity="center_horizontal" 
     android:layout_weight="1" 
     android:progressDrawable="@drawable/apptheme_scrubber_progress_horizontal_holo_light" 
     android:thumb="@drawable/apptheme_scrubber_control_selector_holo_light" /> 

    <TextView 
     android:id="@+id/time" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:paddingLeft="4dip" 
     android:paddingRight="4dip" 
     android:paddingTop="4dip" 
     android:textSize="14sp" 
     android:textStyle="bold" /> 

</LinearLayout>