0

我需要通過NewDateFragment和NewEventFrament之間的串CURDATE,我看到使用捆綁許多國家的人民,但使用這些我仍然有NullPointerException異常。傳遞字符串不使用活動

我將CalendarView轉換爲一個名爲curDate的字符串。

public class NewDateFragment extends Fragment { 

public String curDate; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_newdate, 
      container, false); 


    CalendarView calendar = (CalendarView) view.findViewById(R.id.calendarView); 

    //sets the listener to be notified upon selected date change. 
    calendar.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { 
     @Override 
     public void onSelectedDayChange(CalendarView view, int year, int month, int day) { 
      curDate = day + "/" + month + "/" + year; 

      NewDateFragment fragment = new NewDateFragment(); 
      Bundle bundle = new Bundle(); 
      bundle.putString("date", curDate); 
      fragment.setArguments(bundle); 

      Log.d("Current Date:", curDate); 
     } 
    }); 

} 

public class NewEventFragment extends Fragment { 

    // relative code inside onCreateView 
    Bundle b = getActivity().getIntent().getExtras(); 
     final String dDate = b.getString("date"); 
} 

我的logcat:

10-08 18:34:49.036 10293-10293/com.org.feedme.cisvmeeting.activities W/dalvikvm:線程ID = 1:螺紋與未捕獲的異常退出(組= 0x41640d88) 10-08 18:34:49.056 10293-10293/com.org.feedme.cisvmeeting.activities E/AndroidRuntime:致命異常:主 工藝:com.org.feedme.cisvmeeting.activities,PID: 10293 顯示java.lang.NullPointerException 在com.org.feedme.fragments.NewEventFragment.attemptCreate(NewEventFragment.java:116) 在com.org.feedme.fragments.NewEventFragment $ 1.onClick(NewEventFragment.java:61) 在android.view.View.performClick(View.java:4569) 在android.view.View $ PerformClick.run(查看.java:18570) at android.os.Handler.handleCallback(Handler.java:743) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java :Method.java:136) at android.app.ActivityThread.main(ActivityThread.java:5212) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java: 515) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786) 在com.android.internal.os.ZygoteInit.main(ZY goteInit.java:602) 在dalvik.system.NativeStart.main(本機方法)

感謝所有幫助!

+0

究竟是什麼原因,你不想使用一個活動作爲中間人?如果這兩個片段緊密相關,那很可能它們是同一活動的片段,應該是這樣。 – nbokmans

+0

在我的研究中,使用活動似乎很難,我該怎麼做? –

+0

檢查我的答案。 – nbokmans

回答

0

給定答案的替代方法是使用事件。如果你真的想避免耦合你的代碼 - 意味着擺脫類之間不必要的依賴關係,在你的Activity中有一個變量不是一個好主意。這裏是我的建議:

  • 添加EventBus庫到您的搖籃文件:

    compile 'de.greenrobot:eventbus:2.4.0' 
    
  • 創建一個簡單普通的Java類來表示你的事件:內部

    public class CalendarDateSelectedEvent{ 
        private String currentDate; 
    
        public CalendarDateSelectedEvent(String date){ 
    
         this.currentDate = date; 
        } 
    
        public String getCurrentDate(){ 
    
         return currentDate; 
        } 
    } 
    
  • 您在挑選日期的第一個片段中,只要選擇日期,就可以將事件發佈到第二個片段,如下所示:

    //somewhere when a date is selected 
    onSelectedDayChanged(String dateSelected){ 
        EventBus.getDefault().post(new CalendarDateSelectedEvent(dateSelected)); 
    } 
    
  • 最後,你的第二個片段中,請執行下列操作:

    //could be inside onCreate(Bundle savedInstanceState) method 
    @Override 
    public void onCreate(Bundle saveInstanceState){ 
        //...... 
        EventBus.getDefault().register(this); 
    } 
    
    @Override 
    public void onDestroy(){ 
        super.onDestroy(); 
        EventBus.getDefault().unregister(this); 
    } 
    
    //very important piece here to complete the job 
    public void onEvent(CalenderDateSelectedEvent event){ 
    
        String currentDate = event.getCurrentDate(); 
        //you can now set this date to view. 
    } 
    

在這一點上,你可能會問,爲什麼所有的拼勁讓所有這些代碼;但答案很簡單:活動不必真正知道兩個片段中發生了什麼。您已經消除了代碼中不必要的耦合。

如果您更改活動以執行其他操作,則不必更改片段代碼。

我希望這可以幫助您看到兩種方法在片段之間進行通信的區別!

第一種方法(您接受的答案涉及3方,第二種方法僅涉及2方)。這取決於你選擇。

享受!

0

如果他們在同一個活動的片段,你可以很方便地訪問使用活動它們之間的數據。

第1步:

public String curDate; //you could also make it private and add a public getter & setter 

第2步:在您的Activity聲明String CURDATE在你NewDateFragmentonSelectedDayChange()內,設置活動的CURDATE你剛纔計算的當前日期:

getActivity().curDate = curDate; 

第3步:在您的NewEventFragment中,只需從活動中獲取值:

public String curDate = getActivity().curDate; 
+0

謝謝你,完全爲我工作!簡單而高效! –

+0

爲了正確性/可重用性,您應該創建與用於在活動和片段之間進行通信的方法的接口。他們在任何地方都使用這個接口,並且沒有明確引用片段中的特定Activity類。 – GreyBeardedGeek

相關問題