2014-01-20 96 views
2

我試圖使用活動一次容納2個片段。其中一個片段是,我們將其稱爲第一個片段,正在顯示的片段包含OnClickListener。我希望這個監聽器在Activity中調用一個包含碎片的方法,這個碎片會將第二片碎片與另一碎片交換。碎片全部以編程方式添加。我有以下代碼似乎給我一個錯誤。如何在片段中使用交換片段

我是新來的android,所以代碼是馬虎,主要是爲了測試,所以我會嘗試解釋發生了什麼。

這是包含片段的Activity的代碼。 活動管理成功添加到Fragments,但是,在推送all_jokes文本視圖時收到錯誤。

package com.Ayman.jokeit; 

    import android.app.Activity; 
    import android.app.FragmentManager; 
    import android.app.FragmentTransaction; 
    import android.os.Bundle; 
    import android.support.v4.app.FragmentActivity; 


    public class BrowseActivity extends FragmentActivity{ 
     AllJokes afrag; 
     OneLiners olfrag; 
     selectFragment sfrag ; 
     RaceJokes rfrag; 
     YoMammaJokes yfrag ; 
     LongJokes lfrag ; 
     FragmentTransaction stransaction; 
     FragmentTransaction jtransaction; 
     FragmentTransaction atransaction; 
     FragmentManager jmanager; 
     FragmentManager smanager; 
     FragmentManager amanager; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 



      afrag = new AllJokes(); 
      olfrag = new OneLiners(); 
      sfrag = new selectFragment(); 
      rfrag = new RaceJokes(); 
      yfrag = new YoMammaJokes(); 
      lfrag = new LongJokes(); 

      setContentView(R.layout.browse); 

      //Creats object for fragments 


      //steps for adding fragment to view 
      smanager = getFragmentManager(); 
      jmanager = getFragmentManager(); 

      stransaction = smanager.beginTransaction(); 
      stransaction.add(R.id.browse_layout, sfrag, "selectFragment"); 
      stransaction.commit(); 


      //steps for adding fragment to view 

      jtransaction = jmanager.beginTransaction(); 
      jtransaction.add(R.id.browse_layout, olfrag, "onelinerFragment"); 
      jtransaction.commit(); 

     } 
     public void addAllJokes(){ 
     afrag = new AllJokes(); 
     atransaction = amanager.beginTransaction(); 
     atransaction.replace(R.id.browse_layout, afrag, "afrag"); 
     atransaction.commit(); 

     } 

    } 

這是使用OnClickListener的片段的代碼。

OnClickListener在引用活動內的addalljokes方法(上面的代碼)的片段(以下代碼)內調用方法all_jokes。這似乎導致錯誤。我已經嘗試了多種可能的解決方案無濟於事。請幫助找到解決方案,如果可能的話解釋推理。 (該OnClickListeners都不意味着除了All_Jokes一個工作。

package com.Ayman.jokeit; 

import com.Ayman.jokeit.AllJokes; 

import android.content.Intent; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.app.Fragment; 
import android.widget.TextView; 

public class selectFragment extends Fragment { 
    BrowseActivity browseActivity = new BrowseActivity(); 
    private TextView all_jokes; 
    private TextView one_liners; 
    private TextView yo_mamma_jokes; 
    private TextView race_jokes; 
    private TextView long_jokes; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View selectFragmentView = inflater.inflate(R.layout.select_view, container, false); 
     all_jokes = (TextView) selectFragmentView.findViewById(R.id.all_TextView); 
     one_liners = (TextView) selectFragmentView.findViewById(R.id.one_Liners_TextView); 
     yo_mamma_jokes = (TextView) selectFragmentView.findViewById(R.id.yo_Mama_Jokes_TextView); 
     race_jokes = (TextView) selectFragmentView.findViewById(R.id.race_Jokes_TextView); 
     long_jokes = (TextView) selectFragmentView.findViewById(R.id.long_Jokes_TextView); 


     all_jokes.setOnClickListener(new View.OnClickListener() { 

      @Override 


      public void onClick(View v) { 
       all_jokes(); 

      } 
     }); 

     one_liners.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       one_liners(); 

      } 
     }); 

     yo_mamma_jokes.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       yo_mamma_jokes(); 

      } 
     }); 

     race_jokes.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       race_jokes(); 

      } 
     }); 

     long_jokes.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       long_jokes(); 

      } 
     }); 




     return selectFragmentView; 

     } 


    public void all_jokes(){ 
     BrowseActivity browseActivity = (BrowseActivity) getActivity(); 
     browseActivity.addAllJokes(); 
    } 

    public void one_liners(){ 

    } 

    public void yo_mamma_jokes(){ 

    } 

    public void race_jokes(){ 

    } 
    public void long_jokes(){ 


    } 
} 

謝謝你在先進。

編輯*

以下錯誤收到

01-15 15:01:16.323 6393-6393/com.Ayman.jokeit E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.Ayman.jokeit, PID: 6393 
    java.lang.NullPointerException 
      at com.Ayman.jokeit.BrowseActivity.addAllJokes(BrowseActivity.java:61) 
      at com.Ayman.jokeit.selectFragment.all_jokes(selectFragment.java:90) 
      at com.Ayman.jokeit.selectFragment$1.onClick(selectFragment.java:39) 
      at android.view.View.performClick(View.java:4424) 
      at android.view.View$PerformClick.run(View.java:18383) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4998) 
      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:777) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) 
      at dalvik.system.NativeStart.main(Native Method) 
+0

什麼是錯誤? – Tobrun

+0

nullpointexception –

+0

@AymanElmubark發佈stacktrace並使用接口作爲活動的回調 – Raghunandan

回答

2

你可以使用一個接口來提供你的片段和關聯活動之間的通信,你應該把接口放到第一個片段的onAttach方法中的活動噸。 (有關更多信息,請參閱此link

關聯活動應實現該接口,例如

public interface FragmentSwitcher { 
    void switchSecondFragment(); 
} 

在該接口的方法回調中(在Activity中)執行替換片段事務。用另一個替換第二個片段。

有任何問題嗎?問下面

+0

這似乎是我正在尋找。我會讓你知道它是如何工作的。另外,爲什麼需要接口還有什麼特別的原因嗎? –

+0

@AymanElmubark兩個片段不應該直接相互溝通。也片段由一個活動主持。 http://developer.android.com/training/basics/fragments/communicating.html。您的'browse_layout'是您添加或替換片段的容器 – Raghunandan

+0

這不是必需的,但它是一種更好的做法。它將邏輯解耦。您也可以使用getActivity並將該活動轉換爲正確的活動。但是這可能會導致偶爾的空指針,我沒有遇到這個接口的問題。如果你的問題在實現這種模式後仍然存在,那麼更新你的代碼,我會嘗試自己運行它。親切的問候 – Tobrun

0
atransaction = amanager.beginTransaction(); 

amanager沒有實例化。並且你正在使用它...空指針可能是這條線的線索atransaction.replace(R.id.browse_layout, afrag, "afrag"); ...檢查了這個