避免在我的 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 应用中重复按钮代码的主要内容,如果未能解决你的问题,请参考以下文章
刷新按钮onClick Listview数据必须在android中更新[重复]
在我的 webview 应用程序上调用虚拟方法 'int android.graphics.Bitmap.getWidth()' on an null object reference"