【问题标题】:Android : Making simple code. DRYAndroid:制作简单的代码。干燥
【发布时间】:2015-09-20 08:36:56
【问题描述】:

我是 Java 编程新手。有人可以帮我让我的代码保持干燥吗?

Button level01 = (Button) findViewById(R.id.level01);
level01.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Prefs.setStagePref(getApplicationContext(), 1);
        Intent play = new Intent(LevelActivity.this, PlayActivity.class);
        startActivity(play);
    }
});

Button level02 = (Button) findViewById(R.id.level02);
level02.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Prefs.setStagePref(getApplicationContext(), 2);
        Intent play = new Intent(LevelActivity.this, PlayActivity.class);
        startActivity(play);
    }
});

Button level03 = (Button) findViewById(R.id.level03);
level03.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Prefs.setStagePref(getApplicationContext(), 3);
        Intent play = new Intent(LevelActivity.this, PlayActivity.class);
        startActivity(play);
    }
});

我想要制作超过 20 个按钮,那么如何让这段代码 DRY。

谢谢

【问题讨论】:

  • 你可以使用列表视图

标签: java android dry


【解决方案1】:

把你的重复功能带入方法中

private void f(int i){
        Prefs.setStagePref(getApplicationContext(), i);
        Intent play = new Intent(LevelActivity.this, PlayActivity.class);
        startActivity(play);
}

然后改变你使用点击的方式

在“onClick”布局中

   <ImageButton
                        android:layout_width="wrap_content"
                        android:layout_height="fill_parent"
                        android:id="@+id/saveButton" android:src="@android:drawable/ic_menu_save"
                        android:layout_weight="1" android:background="@drawable/menu_button" android:onClick="onClick"/>
                <ImageButton
                        android:layout_width="wrap_content"
                        android:layout_height="fill_parent"
                        android:id="@+id/wallpaperButton" android:src="@android:drawable/ic_menu_gallery"
                        android:layout_weight="1" android:background="@drawable/menu_button" android:onClick="onClick"/>
                <ImageButton
                        android:layout_width="wrap_content"
                        android:layout_height="fill_parent"
                        android:id="@+id/shareButton" android:src="@android:drawable/ic_menu_share"
                        android:layout_weight="1" android:background="@drawable/menu_button" android:onClick="onClick"
                        android:focusableInTouchMode="false"/>

活动中

public void onClick(View cview) throws IOException {
    switch (cview.getId()) {
        case R.id.saveButton:
            f(1);
            break;

        case R.id.shareButton:
            f(2);
            break;

        case R.id.wallpaperButton:
            f(3);
            break;
}
}

MainActivity implements OnClickListener

...

Button level1 = (Button) findViewById(R.id.level1);
level1.setOnClickListener(this);
Button level2 = (Button) findViewById(R.id.level2);
level2.setOnClickListener(this);
Button level3 = (Button) findViewById(R.id.level3);
level3.setOnClickListener(this);
...

public void onClick(View cview) throws IOException {
    switch (cview.getId()) {
        case R.id.level1:
            f(1);
            break;

        case R.id.level2:
            f(2);
            break;

        case R.id.level3:
            f(3);
            break;
}
}

【讨论】:

    【解决方案2】:
        LinearLayout layout = (LinearLayout) findViewById(R.id.layout_buttons);
        for (int j = 0; j < 20; j++ {
            Button btn = new Button(this);
            btn.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View view) {
                   Prefs.setStagePref(getApplicationContext(), j);
                   Intent play = new Intent(LevelActivity.this, PlayActivity.class);
                   startActivity(play);
                }
            });
            btn.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
            layout.addView(btn);
        }
    

    【讨论】:

      【解决方案3】:

      您可以考虑使用butterknife

      假设您使用的是 gradle,只需添加

      compile 'com.jakewharton:butterknife:7.0.1'
      

      到项目的 app/ 目录下的 build.gradle 文件的依赖项部分。然后添加

      ButterKnife.bind(this);
      

      到您的 Activity.onCreate 方法,或

      ButterKnife.bind(this, view);
      

      如果它在 Activity 之外,则转到 onCreateView 方法。然后,如果你稍微修改你的 xml 给每个按钮一个标签:

      <Button
          android:id="@+id/level01"
          android:layout_width="wrap_content"
          android:layout_height="match_parent"
          android:tag="1"/>
      <Button
          android:id="@+id/level02"
          android:layout_width="wrap_content"
          android:layout_height="match_parent"
          android:tag="2"/>
      <Button
          android:id="@+id/level03"
          android:layout_width="wrap_content"
          android:layout_height="match_parent"
          android:tag="3"/>
      

      然后你就可以做到:

      @OnClick({ R.id.level01, R.id.level02, R.id.level03 })
      public void levelButtonClick(Button levelButton) {
          int value = Integer.parseInt(levelButton.getTag());
          Prefs.setStagePref(getApplicationContext(), value);
          Intent play = new Intent(LevelActivity.this, PlayActivity.class);
          startActivity(play);
      }
      

      【讨论】:

        猜你喜欢
        • 2013-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-13
        • 2014-08-03
        相关资源
        最近更新 更多