[英]Is there a better way of starting a new activity on button click that calling an onClickListener?
是否有比使用onClick属性指定回调方法更好的方法来启动按钮单击上的新活动,如下面的示例所示?
-xml-
<Button
android:id="@+id/button1"
android:onClick="someMethod"
android:text="@string/someString" />
-Java-
public void someMethod(View view) {
startActivity(new Intent(this, SomeActivity.class));
}
我想指定要启动的活动的名称,而不是回调方法的名称。 像这样:
<Button
android:id="@+id/button1"
android:onClick="SomeActivity"
android:text="@string/someString" />
作为解决方案,我建议以下内容。 请原谅伪类非编译(可能)代码:
Button a = findViewById(R.id.button1);
Button b = findViewById(R.id.button2);
// Strings to be fed to the intent. You can use YourActivity.getClass() as well here
String mFirstTag = "your.first.activity.class"
String mSecondTag = "your.second.activity.class"
// This is critical as it will be used by the listener
a.setTag(mFirstTag);
b.setTag(mSecondTag);
// Self explanatory
a.setOnClickListener(mClickListener);
b.setOnClickListener(mClickListener);
// This listener will grab the "tag" object from the clicked view.
// It will be the same tag which we previously set on those buttons.
private OnClickListener mClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(v.getTag()); // Maybe you'll need toString(), or a cast here
startActivity(i);
}
}
希望您能大致了解。
这就是我对Jitsu和Mike M的感谢。
使用android:tag xml属性指定按下按钮时要启动的Activity,构造函数会将onClickListeners设置为View中的所有按钮。
这样,我不必:
-xml-
<RelativeLayout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/MainActivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.playground.MainActivity" >
<Button
android:id="@+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:tag="showActivity"
android:text="@string/somestring" />
</RelativeLayout>
-Java-
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connectButtonClickListeners(findViewById(R.id.MainActivity));
}
// Walk down the View tree starting with parent and connect an onClickListener to each Button.
private void connectButtonClickListeners(View parent) {
if (parent == null)
return;
LinkedList<View> list = new LinkedList<View>();
list.add(parent);
while (list.isEmpty() == false) {
View v = list.pollFirst();
if (v instanceof ViewGroup) {
ViewGroup vg = (ViewGroup) v;
for (int i = 0; i < vg.getChildCount(); i++)
list.add(vg.getChildAt(i));
} else if (v instanceof Button) {
Button b = (Button) v;
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO: Start the new Activity.
System.out.println("Clicked!" + v.getTag());
}
});
}
}
这很简单。 一个单独的类文件MySpecialButton.java中的Subclass Button
:
public class MySpecialButton extends Button {
public MySpecialButton(Context context) {
super(context);
setupOnClickListener();
}
public MySpecialButton(Context context, AttributeSet attrs) {
super(context);
setupOnClickListener();
}
public MySpecialButton(Context context, AttributeSet attrs, int defStyle) {
super(context);
setupOnClickListener();
}
protected void setupOnClickListener() {
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(...);
}
});
}
}
我尚未编译此代码,我急忙编写了它,但应该可以工作。
然后在您的XML中,而不是Button
将您的视图声明为com.yourpacket.yourappname.yourpackage.MySpecialButton
。
编辑:您确实需要在代码中添加一些内容,但是您应该进行管理(上下文引用,导入语句等)。
我喜欢这种方法。 无需switch语句。
每个按钮都具有相同的onClickListener
和带有新活动的类名称的标签:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="startActivityForTag"
android:tag=".HelloActivity"
android:text="Say hello" >
</Button>
点击侦听器通过view标记构造一个类:
public void startActivityForTag(View v) {
String name = v.getTag().toString();
// if name is not fully-qualified, add the package name
if (name.startsWith(".")) {
name = getPackageName() + name;
}
try {
startActivity(new Intent(this, Class.forName(name)));
} catch (ClassNotFoundException e) { ; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.