2017-08-30 103 views
1

我有兩個片段。 片段A導致片段B - 在片段乙我從外部數據庫中獲取數據,並在共享偏好保存的值和通過該回片段Aset_id持續循環ID

片段乙,我有以下,這是處理JSON數組:

public ArrayList getAll_question_ids(){ 
    return all_question_ids; 
} 

@Override 
     public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) { 

      ServerResponse resp = response.body(); 

      //Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

      if (resp.getResult().equals(Constants.SUCCESS)) { 

       SharedPreferences.Editor editor = pref.edit(); 

       Log.d("Question_IDs", "getAllQuestionID() = " + response.body().getQuestion().getAll_question_ids()); 

       editor.putString(Constants.All_QUESTION_IDS,((resp.getQuestion().getAll_question_ids().toString()))); 
       editor.apply(); 

       String questionNumber = pref.getString(Constants.All_QUESTION_IDS, ""); 

       Toast.makeText(getActivity(), "Question ID = " + questionNumber, 
         Toast.LENGTH_LONG).show(); 

       goToCreateQuestionFragment(); 

      } 
      progress.setVisibility(View.INVISIBLE); 
     } 

片段A我然後調用經由onViewCreated方法的方法,如下所示:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    pref = getActivity().getPreferences(0); 

    if ((!pref.getString(Constants.All_QUESTION_IDS, "").equals(null) && !pref.getString(Constants.All_QUESTION_IDS, "").equals(""))) { 
     createQuestionButton(); 
    } 
} 

裏面的createQuestionButton方法是我困惑的地方。我有一個循環,我正在使用它將存儲在共享首選項中的值分配給動態創建的按鈕,該按鈕被添加到線性佈局。

我現在想要設置按鈕的唯一ID並附加onClickListener,以便我可以爲按鈕創建操作。

我讀過,我可以使用View.generateViewId()設備使用API​​ 17及以上,這是偉大的。但是,當我做一個敬酒來檢查分配給每個按鈕的值是否正確創建時,我注意到,而不是隻分配一個ID,我的代碼保持執行4/5次,所以4/5 ids是正在爲每個按鈕生成!

我認爲這是與事實,我在onViewCreated調用方法,但我不知道如何調用該方法。

被調用的方法是如下:

@TargetApi(Build.VERSION_CODES.M) 
public void createQuestionButton() { 

    //get all the question_ids from shared pref, that have been stored from the SetQuestion Activity 
    //in the allQuestionIDS() method 
    String questionNumber = pref.getString(Constants.All_QUESTION_IDS, ""); 
    //converting the above String back into a List 
    questionNumber = questionNumber.substring(1, questionNumber.length() - 1); 
    //split the array using the comma 
    String[] array = questionNumber.split(", "); 
    //Converting questionArray array to a list using Arrays.asList() 
    List list = Arrays.asList(array); 


    if (!questionNumber.equals("") && !questionNumber.equals(null)) { 

     for (Object value : list) { 


      try { 

     /*Dynamically create new Button which includes the question number 
      */ 

       AppCompatButton btn_question = new AppCompatButton(getActivity()); 

     /*LayoutParams (int width, int height,float weight) 
     As LayoutParams defaults in px, I have called a method called dpToPX to make sure the dynamically added EditText is the same size on all devices. 
     */ 
       LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(dpToPx(280), dpToPx(45), 1); 
       btn_question.setBackgroundColor(Color.parseColor("#3B5998")); 
       btn_question.setTextColor(Color.WHITE); 
       btn_question.setText("Question " + value); 
       btn_question.setGravity(Gravity.CENTER); 
       //generate unique ID for each new EditText dynamically created 
       btn_question.setId(View.generateViewId()); 
       params.setMargins(0, dpToPx(10), 0, dpToPx(10)); 
       btn_question.setPadding(0, 0, 0, 0); 
       btn_question.setLayoutParams(params); 
       allEds.add(btn_question); 
       mLayout.addView(btn_question); 

       Toast.makeText(getActivity(), "Question ID = " + btn_question.getId(), 
         Toast.LENGTH_LONG).show(); 

      } catch (Exception e) { 
       Log.d(TAG, "Failed to create new button"); 
      } 
     } 
    } 
} 

這是如何被引起的任何指導,避免最佳實踐,將不勝感激。

編輯

我在B片段通過舉杯,它出現的結果從服務器跨越未來是正確的,但敬酒似乎掛,彷彿它是敬酒相同信息多次。

我檢查瞭解釋器,並且傳入的數據是正確的,所以我不確定它爲什麼會卡在一個循環中,尤其是當片段B中沒有循環時!

的JSON被檢索如下:

{ 
    "result": "success", 
    "message": "All Questions Have Been Selected", 
    "question": { 
     "all_question_ids": ["1","2","3"] 
    } 
} 

回答

0

我建議你使用調試器來逐步進入你的函數,並檢查值上list變量。一個很有可能的原因可能是questionNumber.split(", ");的額外空間。最有可能它應該這樣寫questionNumber.split(",");

+1

我認爲你是對的,我的循環本身執行多次,這只是調用'btn_question.setId(View.generateViewId());'已經明確這一點。雖然,現在我需要弄清楚爲什麼這是因爲傳遞給循環的數據是正確的,但循環次數不正確! –