Tổng hợp Xây dựng và tủy chỉnh một ActionBar trong lập trình android

Thảo luận trong 'Android nâng cao' bắt đầu bởi thanhlongi90.it, 15/7/13.

  1. thanhlong90.it

    thanhlong90.it Admin Support

    Lượt xem: 9,512
    Bài viết này Long sẽ tự tạo cho chính ứng dụng của mình một đối tượng như là đối tượng ActionBar của Android. Và tất nhiên đối tượng này do chính mình tạo ra thì mọi quyền hạn cũng như "luật chơi" là do chính như yêu cầu mà mình mong muốn không phải sự cho phép của Android.
    ActionBar

    1) Source code demo:
    Click vào đây để download source code demo.

    2) Video kết quả chạy demo:


    3) ActionBar là gì:
    - Như hình ảnh bên trên vậy, ActionBar như là thanh tiêu đề của trang trong ứng dụng hiện tại. Mà mỗi trang như vậy nó lại có một tiêu đề cũng như có các nút chức năng hoàn toàn khác nhau.
    - Chức năng mỗi nút là do chính mình hay do phía khách hàng đặt app quyết định.
    - Từ phiên Android lever 11 trở đi (Android 3.0 trở đi) thì Android có hỗ trợ đối tượng ActionBar.

    4) Mô tả thông tin thêm:
    - Trong demo này không sử dụng đối tượng ActionBar của thư viện Android
    - Trong demo này ActionBar là một tập hợp từ các Layout và đối tượng cơ bản (TextView, ImageView, LinearLayout, ...)
    - Đối tượng MyActionBar trong demo này còn thiết lập các sự kiện lắng nghe khi bạn click vào đối tượng.

    5) Source code:
    - MyActionBar.java
    PHP:
    package android.vn.demoandroidactionbar;
     
    import java.util.Destination URLedList;
     
    import android.content.ActivityNotFoundException;
    import android.content.Context;
    import android.content.Intent;
    import android.content.res.TypedArray;
    import android.util.AttributeSet;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ImageButton;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.ProgressBar;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    import android.widget.Toast;
     
    public class 
    MyActionBar extends RelativeLayout implements OnClickListener{
        private 
    LayoutInflater mInflater;
        private 
    RelativeLayout mBarView;
        private 
    ImageView mLogoView;
        private 
    View mBackIndicator;
        private 
    TextView mTitleView;
        private 
    LinearLayout mActionsView;
        private 
    ImageButton mHomeBtn;
        private 
    RelativeLayout mHomeLayout;
        private 
    ProgressBar mProgress;
      
        public 
    MyActionBar(Context contextAttributeSet attrs) {
            
    super(contextattrs);
            
    mInflater = (LayoutInflatercontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     
            
    mBarView = (RelativeLayoutmInflater.inflate(R.layout.actionbarnull);
            
    addView(mBarView);
     
            
    mLogoView = (ImageViewmBarView.findViewById(R.id.actionbar_home_logo);
            
    mHomeLayout = (RelativeLayoutmBarView.findViewById(R.id.actionbar_home_bg);
            
    mHomeBtn = (ImageButtonmBarView.findViewById(R.id.actionbar_home_btn);
            
    mBackIndicator mBarView.findViewById(R.id.actionbar_home_is_back);
            
    mTitleView = (TextViewmBarView.findViewById(R.id.actionbar_title);
            
    mActionsView = (LinearLayoutmBarView.findViewById(R.id.actionbar_actions);
            
    mProgress = (ProgressBarmBarView.findViewById(R.id.actionbar_progress);
            
    TypedArray a context.obtainStyledAttributes(attrsR.styleable.ActionBar);
            
    CharSequence title a.getString(R.styleable.ActionBar_title);
            if (
    title != null) {
                
    setTitle(title);
            }
            
    a.recycle();
        }
      
        public 
    void setHomeAction(Action action) {
            
    mHomeBtn.setOnClickListener(this);
            
    mHomeBtn.setTag(action);
            
    mHomeBtn.setImageResource(action.getDrawable());
            
    mHomeLayout.setVisibility(View.VISIBLE);
        }
     
        public 
    void clearHomeAction() {
            
    mHomeLayout.setVisibility(View.GONE);
        }
     
        public 
    void setHomeLogo(int resId) {
            
    mLogoView.setImageResource(resId);
            
    mLogoView.setVisibility(View.VISIBLE);
            
    mHomeLayout.setVisibility(View.GONE);
        }
     
        public 
    void setDisplayHomeAsUpEnabled(boolean show) {
            
    mBackIndicator.setVisibility(showView.VISIBLE View.GONE);
        }
     
        public 
    void setTitle(CharSequence title) {
            
    mTitleView.setText(title);
        }
     
        public 
    void setTitle(int resid) {
            
    mTitleView.setText(resid);
        }
     
        public 
    void setProgressBarVisibility(int visibility) {
            
    mProgress.setVisibility(visibility);
        }
     
        public 
    int getProgressBarVisibility() {
            return 
    mProgress.getVisibility();
        }
     
        public 
    void setOnTitleClickListener(OnClickListener listener) {
            
    mTitleView.setOnClickListener(listener);
        }
     
        @
    Override
        
    public void onClick(View view) {
            final 
    Object tag view.getTag();
            if (
    tag instanceof Action) {
                final 
    Action action = (Actiontag;
                
    action.performAction(view);
            }
        }
     
        public 
    void addActions(Destination URLedList<ActionactionList) {
            
    int actions actionList.size();
            for (
    int i 0actionsi++) {
                
    addAction(actionList.get(i));
            }
        }
     
        public 
    void addAction(Action action) {
            final 
    int index mActionsView.getChildCount();
            
    addAction(actionindex);
        }
     
        public 
    void addAction(Action actionint index) {
            
    mActionsView.addView(inflateAction(action), index);
        }
     
        public 
    void removeAllActions() {
            
    mActionsView.removeAllViews();
        }
     
        public 
    void removeActionAt(int index) {
            
    mActionsView.removeViewAt(index);
        }
     
        public 
    void removeAction(Action action) {
            
    int childCount mActionsView.getChildCount();
            for (
    int i 0childCounti++) {
                
    View view mActionsView.getChildAt(i);
                if (
    view != null) {
                    final 
    Object tag view.getTag();
                    if (
    tag instanceof Action && tag.equals(action)) {
                        
    mActionsView.removeView(view);
                    }
                }
            }
        }
     
        public 
    int getActionCount() {
            return 
    mActionsView.getChildCount();
        }
     
        private 
    View inflateAction(Action action) {
            
    View view mInflater.inflate(R.layout.actionbar_itemmActionsViewfalse);
            
    ImageButton labelView = (ImageButtonview.findViewById(R.id.actionbar_item);
            
    labelView.setImageResource(action.getDrawable());
            
    view.setTag(action);
            
    view.setOnClickListener(this);
            return 
    view;
        }
     
        public interface 
    Action {
            public 
    int getDrawable();
            public 
    void performAction(View view);
        }
     
        public static abstract class 
    AbstractAction implements Action {
            final private 
    int mDrawable;
     
            public 
    AbstractAction(int drawable) {
                
    mDrawable drawable;
            }
     
            @
    Override
            
    public int getDrawable() {
                return 
    mDrawable;
            }
        }
     
        public static class 
    IntentAction extends AbstractAction {
            private 
    Context mContext;
            private 
    Intent mIntent;
     
            public 
    IntentAction(Context contextIntent intentint drawable) {
                
    super(drawable);
                
    mContext context;
                
    mIntent intent;
            }
     
            @
    Override
            
    public void performAction(View view) {
                try {
                  
    mContext.startActivity(mIntent);
                } catch (
    ActivityNotFoundException e) {
                    
    Toast.makeText(mContextmContext.getText(R.string.actionbar_activity_not_found), Toast.LENGTH_SHORT).show();
                }
            }
        }
     
    }
    - MainActivity.java
    PHP:
    package android.vn.demoandroidactionbar;
     
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.vn.demoandroidactionbar.MyActionBar.Action;
    import android.vn.demoandroidactionbar.MyActionBar.IntentAction;
    import android.widget.Button;
    import android.widget.Toast;
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
     
    public class 
    MainActivity extends Activity {
     
        @
    Override
        
    protected void onCreate(Bundle savedInstanceState) {
            
    super.onCreate(savedInstanceState);
            
    setContentView(R.layout.activity_main);
     
            final 
    MyActionBar myActionBar = (MyActionBarfindViewById(R.id.actionbar);
            
    myActionBar.setTitle("thanhlong90.it - thanhlong90.it");
     
            final 
    Action shareAction = new IntentAction(thiscreateShareIntent(), R.drawable.ic_title_share_default);
            
    myActionBar.addAction(shareAction);
            final 
    Action otherAction = new IntentAction(this, new Intent(thisActivity2.class), R.drawable.ic_title_export_default);
            
    myActionBar.addAction(otherAction);
     
            
    Button startProgress = (ButtonfindViewById(R.id.start_progress);
            
    startProgress.setOnClickListener(new OnClickListener() {
                @
    Override
                
    public void onClick(View v) {
                    
    myActionBar.setProgressBarVisibility(View.VISIBLE);
                }
            });
     
            
    Button stopProgress = (ButtonfindViewById(R.id.stop_progress);
            
    stopProgress.setOnClickListener(new OnClickListener() {
                @
    Override
                
    public void onClick(View v) {
                    
    myActionBar.setProgressBarVisibility(View.GONE);
                }
            });
     
            
    Button removeActions = (ButtonfindViewById(R.id.remove_actions);
            
    removeActions.setOnClickListener(new OnClickListener() {
                @
    Override
                
    public void onClick(View view) {
                    
    myActionBar.removeAllActions();
                }
            });
     
            
    Button addAction = (ButtonfindViewById(R.id.add_action);
            
    addAction.setOnClickListener(new OnClickListener() {
                @
    Override
                
    public void onClick(View view) {
                    
    myActionBar.addAction(new android.vn.demoandroidactionbar.MyActionBar.Action() {
                        @
    Override
                        
    public void performAction(View view) {
                            
    Toast.makeText(MainActivity.this"Added action.",
                                    
    Toast.LENGTH_SHORT).show();
                        }
     
                        @
    Override
                        
    public int getDrawable() {
                            return 
    R.drawable.ic_title_share_default;
                        }
                    });
                }
            });
     
            
    Button removeAction = (ButtonfindViewById(R.id.remove_action);
            
    removeAction.setOnClickListener(new OnClickListener() {
                @
    Override
                
    public void onClick(View view) {
                    
    int actionCount myActionBar.getActionCount();
                    
    myActionBar.removeActionAt(actionCount 1);
                    
    Toast.makeText(MainActivity.this"Removed action."Toast.LENGTH_SHORT).show();
                }
            });
     
            
    Button removeShareAction = (ButtonfindViewById(R.id.remove_share_action);
            
    removeShareAction.setOnClickListener(new OnClickListener() {
                @
    Override
                
    public void onClick(View view) {
                    
    myActionBar.removeAction(shareAction);
                }
            });
        }
     
        public static 
    Intent createIntent(Context context) {
            
    Intent i = new Intent(contextMainActivity.class);
            
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            return 
    i;
        }
     
        private 
    Intent createShareIntent() {
            final 
    Intent intent = new Intent(Intent.ACTION_SEND);
            
    intent.setType("text/plain");
            
    intent.putExtra(Intent.EXTRA_TEXT"Shared from the ActionBar widget.");
            return 
    Intent.createChooser(intent"Share");
        }
    }
    - Activity2.java
    PHP:
    package android.vn.demoandroidactionbar;
     
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.View;
    import android.vn.demoandroidactionbar.MyActionBar.AbstractAction;
    import android.vn.demoandroidactionbar.MyActionBar.IntentAction;
    import android.widget.Toast;
     
    public class 
    Activity2 extends Activity {
     
        @
    Override
        
    public void onCreate(Bundle savedInstanceState) {
            
    super.onCreate(savedInstanceState);
            
    setContentView(R.layout.activity_activity2);
     
            
    MyActionBar actionBar = (MyActionBarfindViewById(R.id.actionbar);
            
    actionBar.setHomeAction(new IntentAction(thisMainActivity.createIntent(this), R.drawable.ic_title_home_default));
            
    actionBar.setDisplayHomeAsUpEnabled(true);
            
    actionBar.addAction(new IntentAction(thiscreateShareIntent(), R.drawable.ic_title_share_default));
            
    actionBar.addAction(new ExampleAction());
            
    actionBar.setTitle("Activity thứ 2");
        }
     
        private 
    Intent createShareIntent() {
            final 
    Intent intent = new Intent(Intent.ACTION_SEND);
            
    intent.setType("text/plain");
            
    intent.putExtra(Intent.EXTRA_TEXT"Shared from the ActionBar widget.");
            return 
    Intent.createChooser(intent"Share");
        }
     
        private class 
    ExampleAction extends AbstractAction {
     
            public 
    ExampleAction() {
                
    super(R.drawable.ic_title_export_default);
            }
     
            @
    Override
            
    public void performAction(View view) {
                
    Toast.makeText(Activity2.this"Hiển thị TOAST!"Toast.LENGTH_SHORT).show();
            }
     
        }
     
    }
    - Và còn nhiều tập tin xml, activity cũng như androidmenifest ... các bạn download source về xem nhé

    Bài viết đăng lên diễn đàn khác vui lòng ghi rõ nguồn: Android.vn
    Pass giải nén: http://android.vn
    Support: thanhlong90.it@gmail.com
    action, action bar, custom, title bar, thanhlong90.it
    nttaivn, HaiHackthethanh1207 thích bài này.
  2. tinhte333

    tinhte333 Banned

    thanks for share
  3. dzekon

    dzekon New Member

    sao mình k down đc source vậy?
    Bạn xem lại link giúp mình với :D
  4. thanhlong90.it

    thanhlong90.it Admin Support Staff Member

    Đã checks, links hoàn toàn bình thường!
  5. hiepsi462353

    hiepsi462353 New Member

  6. batoac2013

    batoac2013 New Member

  7. dannylee

    dannylee Member

    a Long xem lại e mấy source code vs,kích vào toàn k load đc
  8. thanhlong90.it

    thanhlong90.it Admin Support Staff Member

    Bạn click vào nó sẽ hiện ra trang trung gian quảng cáo, đợi 5s rồi kích biểu tượng vàng vàng góc phía trên bên phải là nó nhảy qua trang mediafire, rồi click download nhé!
  9. dannylee

    dannylee Member

    trc down nhanh gọn,h fai load hơn chục lần mới đc :(
  10. luanit

    luanit New Member

    a thanhlong90.it cho e hỏi..sao nút action overflow không hiển thị trên 4.1 mà nó lại hiển thị đc trên 4.4 cả 2 hdh này đều hỗ trợ action overflow mà???

Chia sẻ trang này