跳至主要内容

how to make your click event and handler easier to read in Android Activities


How to make your click event and handler easy to read.
If you have one button event in your activity, you can add listener like this.
    final String test = "test";

    findViewById(R.id.button).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(getApplicationContext(), test, Toast.LENGTH_SHORT).show();
        }
    });
But this is rarely.  Also you wrote it everywhere like this. 
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        Toast.makeText(getApplicationContext(), test, Toast.LENGTH_SHORT).show();
    }
});

findViewById(R.id.button2).setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        Toast.makeText(getApplicationContext(), test, Toast.LENGTH_SHORT).show();
    }
});

findViewById(R.id.button3).setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        Toast.makeText(getApplicationContext(), test, Toast.LENGTH_SHORT).show();
    }
});

// ...
Then your change one of them, change event ,You will be lost. 
So I think the best way to manage you events is like this, for example :
public class ClickEventExampleActivity extends Activity implements OnClickListener {

    private static final String TAG = "ClickEventExampleActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.cropimage);
        bindEvents();
    }

    public void bindEvents() {
        findViewById(R.id.button).setOnClickListener(this);
        findViewById(R.id.discard).setOnClickListener(this);
        findViewById(R.id.image).setOnClickListener(this);
        findViewById(R.id.rotateLeft).setOnClickListener(this);
        findViewById(R.id.rotateRight).setOnClickListener(this);
        findViewById(R.id.save).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button:
            // TODO button clicked
            break;
        case R.id.discard:
            // TODO discard clicked
            break;
        case R.id.image:
            // TODO image clicked
            break;
        case R.id.rotateLeft:
            // TODO rotateLet clicked
            break;
        case R.id.rotateRight:
            // TODO rotateRight clicked
            break;
        case R.id.save:
            // TODO save clicked
            break;
        default:
            Log.v(TAG, "clicked other:" + v.getId());
            break;
        }
    }
} 
Then you find anyone of them ,you can go onClick and go one case. 
Why ? 
The advantage is not only easy to management, but also improves the efficiency.
So the same , compare in flow code.
public class HanlderEventsExampleActivity extends Activity {

    private static final int    HANDLER_SHOW_DIALOG = 1;
    private static final int    HANDLER_SHOW_MESSAGE    = 2;

    private static Handler      mBadHandler     = new Handler();

    private static Handler      mGoodHandler        = new Handler() {

            public void handleMessage(Message msg) {
            switch (msg.what) {
                case HANDLER_SHOW_DIALOG:
                break;

                                case HANDLER_SHOW_MESSAGE:
                break;

                default:
                break;
            }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mBadHandler = new Handler();

        // bad style
        mBadHandler.postDelayed(new Runnable() {

            @Override
            public void run() {
                // TODO something
            }
        }, 1000);

        mBadHandler.post(new Runnable() {

            @Override
            public void run() {
                // TODO something
            }
        });

        // good style
        {
            // show dialog
            Message msg = new Message();
            msg.what = HANDLER_SHOW_DIALOG;
            Bundle b = new Bundle();
            b.putString("key", "test");
            msg.setData(b);
            mGoodHandler.sendMessage(msg);

            // show message
            mGoodHandler.sendEmptyMessage(HANDLER_SHOW_MESSAGE);
            //
            mGoodHandler.sendEmptyMessageDelayed(HANDLER_SHOW_MESSAGE, 10000);
        }
    }

}
Now you can , If this is an anonymous class, in every time when using the newly created a class. If I recommend is used this way, so you don't have to create, every time is used directly, don't need to create.

handler :


If you use an anonymous class, will go up a new thread for their execution. Again to update the UI thread if I recommended way is to use, then you need more than one thread to communicate with the UI thread. Specific how Handler implementation, I have no in-depth study, but more than one thread, or a little more overhead is yes.
So I think, the development of Android Java code using the above best speak this kind of style, good read good understanding, also promote efficiency, why not?
Above is only personal point of view, if don't agree, please give comments, or take the facts to prove my point of view is wrong!





评论

此博客中的热门博文

How to change ViewPager scroll animation duration and velocity

When you call change current selected view pager position you may call like this. // change current position default is viewPager.setCurrentItem(position, true); viewPager . setCurrentItem ( position ); There will show transaction animation for change position , but this animation is too fast. So I want change this animation. When I see source code I find this, like flow. where is the scroll animation and speed.     int duration = 0 ;     velocity = Math . abs ( velocity );     if ( velocity > 0 ) {         duration = 4 * Math . round ( 1000 * Math . abs ( distance / velocity ));     } else {         final float pageWidth = width * mAdapter . getPageWidth ( mCurItem );         final float pageDelta = ( float ) Math . abs ( dx ) / ( pageWidth + mPageMargin );         duration = ( int ) (( pageDelta + 1 ) * 100 );     }     duration = Math . min ( duration , MAX_SETTLE_DURATION );     mScroller . startScroll ( sx , sy , dx , d

how to open context menu for android listview item button

Like title, here is this problem in my activity like this: An more button in every row of listview item . When I click this more button then show activity context menu. So I try to click button, but open context menu is the Adaper's context menu. My  Adapter  is extends from BaseAdapter ,  BaseAdapter  has not context menu. My solution like example : <ImageButton android:id="@+id/more" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="15dp" android:background="#00000000" android:src="@drawable/btn_addressbook_more" android:onClick="onMoreClick"/> Add an event named  onMoreClick , when user click this button will do  onClick  event in  activity . // maybe you can registe

How to use Realm database in Kotlin

Hot to use Realm in android project. Befor you use realm we should be read documentation https://realm.io/docs/java/latest#getting-started Then we got the way how to install. Install Realm as a Gradle plugin. Setp 1:   change build.gradle in project level buildscript { repositories { jcenter() } dependencies { classpath "io.realm:realm-gradle-plugin:5.14.0" } } Step 2:   Apply the realm-android plugin to the top of the application level build.gradle file. Create reaml map Object There has two way for mapping Object Make   Object   extends   ReamlObject Or make   Object   implement   ReamlModel Declear reaml mapping objects Realm not support   data class   yet. So we can't use it now. And object will make it open, because Realm object will generate subclass after   aapt   or   kapt . // 1. open class User : RealmObject() { var id: String = UUID . random UUID() . to String() var name: String = "