I appreciate my question seems a duplicate of this however, I am tackling the same thing in a different manner, so I am unable to find a suitable solution.
I am working with fragments and in this particular scenario, I have two fragments, fragment A and fragment B.
Fragment A calls fragment B, in fragment B a call to an external DB is made and the data is saved in shared preferences.
This data is then passed back to fragment A, a loop is then made which will loop out the IDs stored in shared preferences
and add them to a button, which is added to a Linear Layout.
This is all working fine, however now I would like to add an OnClickListeners to each button. Each button will have a different function (basically, each button will represent and access an individual question stored in my DB).
Here is my method where the dynamic button is created:
@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 (final Object value : list) {
try {
/*Dynamically create new Button which includes the question number
*/
btn_question = new AppCompatButton(getActivity());
/*LayoutParams (int width, int height,float weight)
As LayoutParams is defaulted in px, I have called a method called dpToPX to make sure
the dynamically added Button 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 Button 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);
btn_question.setTag(btn_question);
btn_question.setOnClickListener(this);
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");
}
}
}
}
Then I am trying to call each button here
@Override
public void onClick(View view) {
switch (view.getId())
{
case R.id.btn_add_question:
goToQuestion();
break;
case R.id.btn_remove_all_questions:
//show dialog box asking if user definitely wants to remove all questions
showDialog();
break;
// case btn_question.getId():
}
}
XML
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/create_questions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/facebookBlue"
android:orientation="vertical"
android:weightSum="1">
<android.support.design.widget.TextInputEditText
android:id="@+id/tv_setQuestions"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:inputType="none"
android:text="@string/setQuestions"
android:textColor="@android:color/background_light"
android:textColorLink="@android:color/background_light"
android:textSize="30sp"
android:textStyle="bold" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="1">
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="Press 'Add Question' to Add a Question and it's Answer"
android:textColor="@android:color/background_light"
android:textSize="24sp" />
</FrameLayout>
<LinearLayout
android:id="@+id/buttonGroupLayout" <-----Here is where the dynamic button is added
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical">
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="1">
<android.support.v7.widget.AppCompatButton
android:id="@+id/btn_add_question"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:layout_marginTop="8dp"
android:background="@color/colorPrimary"
android:text="Add Question"
android:textColor="@android:color/white" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="1">
<android.support.v7.widget.AppCompatButton
android:id="@+id/btn_remove_all_questions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:background="@color/colorPrimary"
android:text="@string/removeAllQuestions"
android:textColor="@android:color/white" />
</FrameLayout>
<ProgressBar
android:id="@+id/progress"
style="@style/Base.Widget.AppCompat.ProgressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/btn_submit_team"
android:layout_marginTop="26dp"
android:indeterminate="true"
android:visibility="invisible" />
</LinearLayout>
At first, I thought to access each button I would need to use generateViewId() however, the ID is dependant on the position of the button within the XML.
So then I read that setTag is needed instead - however now I am getting confused on how to implement it and access it within the individual button within the onClick.
Any assistance would be really appreciated.