我有兩個片段。 片段A導致片段B - 在片段乙我從外部數據庫中獲取數據,並在共享偏好保存的值和通過該回片段A。set_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"]
}
}
我認爲你是對的,我的循環本身執行多次,這只是調用'btn_question.setId(View.generateViewId());'已經明確這一點。雖然,現在我需要弄清楚爲什麼這是因爲傳遞給循環的數據是正確的,但循環次數不正確! –