避免在我的 Android 应用中重复按钮代码

Posted

技术标签:

【中文标题】避免在我的 Android 应用中重复按钮代码【英文标题】:Avoid repeating button code in my Android app 【发布时间】:2018-02-22 13:06:31 【问题描述】:

我正在开发,我想到了我在使用 Java 进行 android 开发时遇到的一个小问题。我有这个 MainActivity 类。视图只是一些按钮,每个按钮调用不同的活动。现在我有这个代码

public class MainActivity extends AppCompatActivity 
    private Button button;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button = findViewById(R.id.pedidos);

    button.setOnClickListener(new View.OnClickListener() 

        @Override
        public void onClick(View v) 
            Intent intent = new Intent(getApplicationContext(), PedidosActivity.class);
            startActivity(intent);
        
    );

因此,考虑到我需要再添加两个按钮,这样我就可以根据我按下哪个按钮来启动另外两个不同的活动,对于我在项目中添加的每个新活动,我需要两次重复此代码 n 次。我相信必须有更好的方法来做到这一点。我已经认为我可以做一个工厂模式,使用一个类作为接口,方法是 callActivity() 像这样:

public interface ActivityFactory()
public OnClickListener setOnClickListener();

此方法将通过参数接收正在实例化新视图的活动的上下文,一个具有不同视图作为参数的 Enum 类型,它会为按钮返回一个新的 eventListener,这将使您进入新视图,像这样:

@Override
button.setOnClickListener(getContextActivity(), EnumClass.NewActivity);

我还没有找到任何关于这个主题的帖子/博客/线程,可能是因为我还是 Android 开发的新手,但我发现这对于任何 Android 开发人员来说都非常有趣和有价值,所以任何类型的方法真的很受欢迎。

编辑: 我认为我留下了部分解释,所以我将在此处添加。我想跳过新的两个按钮的实例化,所以我想知道只实例化一个按钮的方式,并根据你按下的按钮给它视图的值。

【问题讨论】:

这里是答案***.com/a/25905313/8448886 【参考方案1】:

您可以创建一个View.OnClickListener 并在多个按钮中使用它:

@Override
protected void onCreate(Bundle savedInstanceState) 
    ...
    findViewById(R.id.button_1).setOnClickListener(mButtonsClickListener);
    findViewById(R.id.button_2).setOnClickListener(mButtonsClickListener);
    ....



private View.OnClickListener mButtonsClickListener = new View.OnClickListener() 
    @Override
    public void onClick(View v) 
        switch (v.getId()) 
            case R.id.button_1:
                // Actions for button 1
                break;
            case R.id.button_2:
                // Actions for button 2
                break;

        
    
;

【讨论】:

【参考方案2】:

你可以这样做 - 假设您有活动 A、B 和 C 您想从 HomeActivity 调用 A、B 和 C

首先在HomeActivity布局中放一个LinearLayout为-

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_add_event"
        android:layout_
        android:layout_
        >
    <!--Your container will hold your buttons-->
    <LinearLayout 
        android:id="@+id/container"
        android:layout_
        android:layout_
        android:orientation="vertical"
        />
    </RelativeLayout>

现在在您的HomeActivity 中创建一个类数组 -

public class HomeActivity extends AppCompatActivity implements View.OnClickListener
    private Class[] arrayClass= A.class, B.class,C.class; // classes you want to open
      private String[] buttonNames= "A", "B", "C";  // button texts

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        LinearLayout container = (LinearLayout)findViewId(R.id.container);
        // adding buttons in container
        for(int index=0;index<arrayClass.length && arrayClass.lenght == buttonNames.length; index++)
            Button button = new Button(this);
            button.setText(buttonNames[index]);
            button.setOnClickListener(this)
            button.setTag(arrayClass[index]);
            container.addView(button);
        
    

   @Override
    public void onClick(View v) 

    if(v.getTag() instanceOf Class )
      // will open your particular activity
      startActivity(new Intent(this,(Class)v.getTag()));
    

   

现在只需在您的数组中添加新的类类型和名称。您的代码可以自己运行

【讨论】:

这正是我想要的,非常感谢。我认为这是一个可以用来实例化多个按钮的最佳解决方案,这样一个 Android 主类只需要一段代码! 无意不尊重其他用户也不是他们的cmets,这里的所有cmets都帮助我从不同的角度看待这一点。谢谢大家!【参考方案3】:

利用黄油刀

它将绑定你所有的视图,易于编码

例如:

class ExampleActivity extends Activity 
    @BindView(R.id.title) TextView title;
    @BindView(R.id.subtitle) TextView subtitle;
    @BindView(R.id.footer) TextView footer;

    @Override public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.simple_activity);
        ButterKnife.bind(this);
        // TODO Use fields...
    

以及处理点击,

利用这个,

@OnClick( R.id.door1, R.id.door2, R.id.door3 )
public void pickDoor(View view) 
    switch (view.getId()) 
    case R.id.door1:

        break;
    case R.id.door2:

        break;
    case R.id.door3:

        break;
    default:

        break;
    

并在 android studio 中添加 Android ButterKnife Zelezny 插件。

欲了解更多信息,请查看http://jakewharton.github.io/butterknife/

希望对你有帮助。

【讨论】:

如果你正在创建大型应用程序,使用这组代码显示它不是使用这个Butter Knife的捷径, @MohammadAli ButterKnife 有助于防止样板代码。使用和理解真的很简单。尝试一次,你会爱上它的。 是的,我会在我的客户端应用程序中使用它兄弟,但它会创建很多代码,所以我会告诉你@Sachin 很简单,我想你不知道,不需要自己打字。将鼠标指向onCreate中的R.layout.xmlname,Alt+fn+insert会自动绑定所有视图,Android ButterKnife Zelezny,看看吧。 好的兄弟,我一定会检查这个,谢谢你的建议:) @SachinVarma【参考方案4】:

看这个,

Class<?> c = Class.forName("SecondPage");
Intent newActivity = new Intent(this, c);

【讨论】:

【参考方案5】:

implements View.OnClickListener 之后你可以添加按钮的findViewByid 然后取一个button 名称和setOnClickListener(this); LIKE button.setOnClickListener(this);

请看我下面的代码:

public class EventsListActivity extends AppCompatActivity implements View.OnClickListener

    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_events_list);

        init();
    
    private void init() 
        txtClose = (TextView) findViewById(R.id.txtClose);
        txtClose.setOnClickListener(this);

        txtAdd = (TextView) findViewById(R.id.txtAdd);
        txtAdd.setOnClickListener(this);
    

    @Override
    public void onClick(View v) 
        switch (v.getId()) 

        case R.id.txtAdd:
            Intent intent = new Intent(this, AddEventActivity.class);
            startActivity(intent);
        break;

        case R.id.txtClose:
            finish();
        break;      
    

【讨论】:

以上是关于避免在我的 Android 应用中重复按钮代码的主要内容,如果未能解决你的问题,请参考以下文章

读取,写入和保存数据Android应用程序[重复]

刷新按钮onClick Listview数据必须在android中更新[重复]

如何在android的操作栏中创建按钮[重复]

如何使应用程序的背景图像重复

Android键盘输入/下一步按钮处理程序[重复]

在我的 webview 应用程序上调用虚拟方法 'int android.graphics.Bitmap.getWidth()' on an null object reference"