在片段中链接两个按钮
Linking two buttons In a fragment
我在将片段中的两个按钮链接到 class 时遇到问题。我有一个工作,但任何尝试将第二个链接到另一个 class 的尝试都失败了。这是我的一个按钮的代码。提前致谢!
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.account, container, false);
Button button = (Button)view.findViewById(R.id.btGlobex);
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v){
switch(v.getId()){
case R.id.btGlobex:
Intent intent = new Intent(getActivity(), GlobexActivity.class);
startActivity(intent);//Edited here
break;
}
}
});
return view;
}
更新:
我收到了一些很好的回复,但是当我点击帐户 Fragment 时我的应用程序崩溃了,我不知道为什么。更新后的代码如下:
public class AccountFragment extends Fragment implements View.OnClickListener{
public AccountFragment() {
}
public static AccountFragment newInstance() {
AccountFragment fragment = new AccountFragment();
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.account, container, false);
Button btGlobex = (Button)getView().findViewById(R.id.btGlobex);
btGlobex.setOnClickListener(onClickListener);
Button btUmbrella = (Button)getView().findViewById(R.id.btUmbrella);
btUmbrella.setOnClickListener(onClickListener);
return view;
}
private View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v){
switch(v.getId()){
case R.id.btGlobex:
Intent intent1 = new Intent(getActivity(), GlobexActivity.class);
startActivity(intent1);//Edited here
break;
case R.id.btUmbrella:
Intent intent2 = new Intent(getActivity(), UmbrellaActivity.class);
startActivity(intent2);//Edited here
break;
}
}
};
@Override
public void onClick(View view) {
}
}
我收到以下错误日志
03-08 20:10:40.974 5458-5458/com.qreceipts.qreceipts E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.qreceipts.qreceipts, PID: 5458
java.lang.NullPointerException
at com.qreceipts.qreceipts.AccountFragment.onCreateView(AccountFragment.java:29)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2189)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:757)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2355)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2146)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2098)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2008)
at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:710)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5021)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643)
at dalvik.system.NativeStart.main(Native Method)
再次感谢您的帮助!
我认为问题在于当你这样做时
Button button = (Button)view.findViewById(R.id.btGlobex);
此按钮将始终链接到 R.id.btGlobex,因此您的 v.getId() 开关盒将始终获得 R.id.btGlobex
的 ID
如果您希望第二个按钮以不同的 class 启动 Intent,您需要通过第二个按钮上的 findViewById 执行与第一个按钮相同的操作,然后向其添加一个 onClickListener 以启动你的第二个 class,或者我认为像这样实现 onClickListener 接口:
public class YourFragment extends Fragment implements View.OnClickListener {
然后在 onCreateView 中为您的按钮执行此操作:
Button button = (Button) view.findViewById(R.id.button1);
button.setOnClickListener(this);
Button button2 = (Button) view.findViewById(R.id.button2);
button2.setOnClickListener(this);
然后将你的 switch case 放在 onCreateView 之外作为它自己的方法:
@Override
public void onClick(View v) {
// Switch cases here
}
有关详细信息,请参阅 。
也许您应该像这样设置您的 onClickListener?
public class YourFragment extends Fragment implements View.OnClickListener {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.account, container, false);
Button btGlobex = (Button) view.findViewById(R.id.btGlobex);
btGlobex.setOnClickListener(this);
Button btUmbrella = (Button) view.findViewById(R.id.btUmbrella);
btUmbrella.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btGlobex:
Intent intent1 = new Intent(getActivity(), GlobexActivity.class);
startActivity(intent1);
break;
case R.id.btUmbrella:
Intent intent2 = new Intent(getActivity(), UmbrellaActivity.class);
startActivity(intent2);
break;
default:
break;
}
}
看到更新后的代码,问题就清楚了。在第一种情况下,您正在创建一个新的匿名 OnClickListener 并将其分配给您的按钮。
当您添加第二个按钮时,您会将 "this" 指定为新的侦听器,但是如果您的 class 没有实现 OnClickListener 并提供 onClick 方法,那么这将不起作用。
您可以创建一个侦听器来使用,将其设为 class 级别变量,以便您可以在整个 class 期间使用它。这意味着您需要在 onCreateView 方法之外将其定义为私有成员。
private OnClickListener onClickListener = new OnClickListener() {
@Override
public void onClick(View v){
switch(v.getId()){
case R.id.btGlobex:
Intent intent1 = new Intent(getActivity(), GlobexActivity.class);
startActivity(intent1);//Edited here
break;
case R.id.btUmbrella:
Intent intent2 = new Intent(getActivity(), UmbrellaActivity.class);
startActivity(intent2);//Edited here
break;
}
}
}
现在您的 class 提供了 OnClickListener 接口的实现,您现在可以将此侦听器传递给您的按钮。
Button btGlobex = (Button)findViewById(R.id.btGlobex);
btGlobex.setOnClickListener(onClickListener);
Button btUmbrella = (Button)findViewById(R.id.btUmbrella);
btUmbrella.setOnClickListener(onClickListener);
return view;
在您的第二个示例中,您将 "this" 传递给按钮,这与您的预期不符。您正在创建一个永远不会被使用的匿名 OnClickListener,当您使用 "this" 关键字时,它会尝试传递整个 class。除非您的 class 实现了 OnClickListener 接口,并提供了 onClick 方法的实现,否则那是行不通的。
我在将片段中的两个按钮链接到 class 时遇到问题。我有一个工作,但任何尝试将第二个链接到另一个 class 的尝试都失败了。这是我的一个按钮的代码。提前致谢!
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.account, container, false);
Button button = (Button)view.findViewById(R.id.btGlobex);
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v){
switch(v.getId()){
case R.id.btGlobex:
Intent intent = new Intent(getActivity(), GlobexActivity.class);
startActivity(intent);//Edited here
break;
}
}
});
return view;
}
更新: 我收到了一些很好的回复,但是当我点击帐户 Fragment 时我的应用程序崩溃了,我不知道为什么。更新后的代码如下:
public class AccountFragment extends Fragment implements View.OnClickListener{
public AccountFragment() {
}
public static AccountFragment newInstance() {
AccountFragment fragment = new AccountFragment();
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.account, container, false);
Button btGlobex = (Button)getView().findViewById(R.id.btGlobex);
btGlobex.setOnClickListener(onClickListener);
Button btUmbrella = (Button)getView().findViewById(R.id.btUmbrella);
btUmbrella.setOnClickListener(onClickListener);
return view;
}
private View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v){
switch(v.getId()){
case R.id.btGlobex:
Intent intent1 = new Intent(getActivity(), GlobexActivity.class);
startActivity(intent1);//Edited here
break;
case R.id.btUmbrella:
Intent intent2 = new Intent(getActivity(), UmbrellaActivity.class);
startActivity(intent2);//Edited here
break;
}
}
};
@Override
public void onClick(View view) {
}
}
我收到以下错误日志
03-08 20:10:40.974 5458-5458/com.qreceipts.qreceipts E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.qreceipts.qreceipts, PID: 5458
java.lang.NullPointerException
at com.qreceipts.qreceipts.AccountFragment.onCreateView(AccountFragment.java:29)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2189)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:757)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2355)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2146)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2098)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2008)
at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:710)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5021)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643)
at dalvik.system.NativeStart.main(Native Method)
再次感谢您的帮助!
我认为问题在于当你这样做时
Button button = (Button)view.findViewById(R.id.btGlobex);
此按钮将始终链接到 R.id.btGlobex,因此您的 v.getId() 开关盒将始终获得 R.id.btGlobex
的 ID如果您希望第二个按钮以不同的 class 启动 Intent,您需要通过第二个按钮上的 findViewById 执行与第一个按钮相同的操作,然后向其添加一个 onClickListener 以启动你的第二个 class,或者我认为像这样实现 onClickListener 接口:
public class YourFragment extends Fragment implements View.OnClickListener {
然后在 onCreateView 中为您的按钮执行此操作:
Button button = (Button) view.findViewById(R.id.button1);
button.setOnClickListener(this);
Button button2 = (Button) view.findViewById(R.id.button2);
button2.setOnClickListener(this);
然后将你的 switch case 放在 onCreateView 之外作为它自己的方法:
@Override
public void onClick(View v) {
// Switch cases here
}
有关详细信息,请参阅
也许您应该像这样设置您的 onClickListener?
public class YourFragment extends Fragment implements View.OnClickListener {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.account, container, false);
Button btGlobex = (Button) view.findViewById(R.id.btGlobex);
btGlobex.setOnClickListener(this);
Button btUmbrella = (Button) view.findViewById(R.id.btUmbrella);
btUmbrella.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btGlobex:
Intent intent1 = new Intent(getActivity(), GlobexActivity.class);
startActivity(intent1);
break;
case R.id.btUmbrella:
Intent intent2 = new Intent(getActivity(), UmbrellaActivity.class);
startActivity(intent2);
break;
default:
break;
}
}
看到更新后的代码,问题就清楚了。在第一种情况下,您正在创建一个新的匿名 OnClickListener 并将其分配给您的按钮。
当您添加第二个按钮时,您会将 "this" 指定为新的侦听器,但是如果您的 class 没有实现 OnClickListener 并提供 onClick 方法,那么这将不起作用。
您可以创建一个侦听器来使用,将其设为 class 级别变量,以便您可以在整个 class 期间使用它。这意味着您需要在 onCreateView 方法之外将其定义为私有成员。
private OnClickListener onClickListener = new OnClickListener() {
@Override
public void onClick(View v){
switch(v.getId()){
case R.id.btGlobex:
Intent intent1 = new Intent(getActivity(), GlobexActivity.class);
startActivity(intent1);//Edited here
break;
case R.id.btUmbrella:
Intent intent2 = new Intent(getActivity(), UmbrellaActivity.class);
startActivity(intent2);//Edited here
break;
}
}
}
现在您的 class 提供了 OnClickListener 接口的实现,您现在可以将此侦听器传递给您的按钮。
Button btGlobex = (Button)findViewById(R.id.btGlobex);
btGlobex.setOnClickListener(onClickListener);
Button btUmbrella = (Button)findViewById(R.id.btUmbrella);
btUmbrella.setOnClickListener(onClickListener);
return view;
在您的第二个示例中,您将 "this" 传递给按钮,这与您的预期不符。您正在创建一个永远不会被使用的匿名 OnClickListener,当您使用 "this" 关键字时,它会尝试传递整个 class。除非您的 class 实现了 OnClickListener 接口,并提供了 onClick 方法的实现,否则那是行不通的。