2017-03-08 44 views
0

我有一個問題,從片段鏈接到一個類的兩個按鈕。我有一個工作,但任何嘗試獲得第二個鏈接到一個不同的類是失敗的。這是我爲這個Button創建的代碼。提前致謝!鏈接兩個按鈕在一個片段

@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; 
} 

更新: 我已經得到了一些偉大的反應,但我的應用程序崩潰,當我點擊帳戶片段,我想不通,爲什麼。更新後的代碼如下:

公共類AccountFragment擴展片段實現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:致命例外:main 進程: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) 在android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528) 在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595) android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:757) at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2355) at android.supp ort.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2146) 在android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2098) 在android.support.v4.app.FragmentManagerImpl.execPendingActions(在android.os.Handler上的android.os.Handler.handleCallback(Handler.java:733) 。 .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(NAT香港專業教育學院法) 在java.lang.reflect.Method.invoke(Method.java:515) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:827) 在com.android.internal .os.ZygoteInit.main(ZygoteInit.java:643) at dalvik.system.NativeStart.main(Native Method)

再次感謝您的幫助!

+0

因此,這是該作品的按鈕,或者不起作用按鈕的代碼? – dahui

+0

這是可用的按鈕的代碼。我有第二個按鈕稱爲btUmbrella,我似乎無法工作我試過這個代碼的一些變化,但無濟於事。 – NiamLeeson

+0

後不工作的代碼,沒有人將能夠解決他們的代碼無法看到 – dahui

回答

0

看到更新的代碼後,問題就很清楚了。在第一種情況下,您正在創建一個新的匿名OnClickListener並將其僅分配給您的按鈕。

當您添加要分配「本」是新的聽衆,但是如果您的類未實現OnClickListener,並提供一個onClick方法,那麼這將無法工作第二個按鈕。

您可以創建一個偵聽器來使用,使之成爲一流水平的變量,因此你可以通過類使用它。這意味着您需要在您的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; 
     } 
    } 
} 

現在你的類提供OnClickListener接口的實現,你現在可以將此監聽器傳遞到您的按鈕。

Button btGlobex = (Button)findViewById(R.id.btGlobex); 
btGlobex.setOnClickListener(onClickListener); 
Button btUmbrella = (Button)findViewById(R.id.btUmbrella); 
btUmbrella.setOnClickListener(onClickListener); 
return view; 

在你的第二個例子,你逝去的「本」的按鈕,這是不工作,你是如何期待。您正在創建一個永遠不會使用的匿名OnClickListener,當您使用「this」關鍵字時,它正在嘗試傳遞整個班級。除非你的類實現了OnClickListener接口,並且提供了onClick方法的實現,否則這將不起作用。

1

我認爲這個問題是,當你做

Button button = (Button)view.findViewById(R.id.btGlobex); 

該按鈕總是會被鏈接到R.id.btGlobex,所以你v.getId()開關的情況下總是會得到R.id的ID。btGlobex

如果你想讓你的第二個按鈕以不同的類開始意圖,你需要通過第二個按鈕上的findViewById來完成第一個按鈕的操作,並添加一個onClickListener來啓動第二個類,或實現這樣的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); 

然後把你的開關情況下,onCreateView外面它自己的方法:

@Override 
public void onClick(View v) { 
    // Switch cases here 
} 

有關更多信息,請參見this answer


也許你應該像這樣設置你的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; 
     } 
    } 
+0

我試過類似的東西,但無法讓它工作。我不確定它是否在片段中以不同方式完成。 (我對android非常陌生!) – NiamLeeson

+0

在您的非工作代碼中,您可以嘗試將onClick作爲onCreateView之外的自己的方法嗎? –

+0

我添加了更新。而且你完全應該檢查我發佈的關於如何使用onClickListener的鏈接,它有一些我認爲很好的例子。 –

相關問題