【发布时间】:2017-09-01 10:53:52
【问题描述】:
我很欣赏我的问题似乎与 this 重复,但是,我正在以不同的方式解决同一问题,因此我无法找到合适的解决方案。
我正在处理片段,在这个特定场景中,我有两个片段,片段 A 和 片段 B。
片段 A 调用 片段 B,在 片段 B 中调用外部数据库并将数据保存在共享首选项中。
然后将这些数据传回片段A,然后进行一个循环,循环出存储在shared preferences 中的ID,并将它们添加到一个按钮,该按钮被添加到线性布局.
这一切都很好,但是现在我想为每个按钮添加一个 OnClickListeners。每个按钮都有不同的功能(基本上,每个按钮将代表和访问存储在我的数据库中的单个问题)。
这是我创建动态按钮的方法:
@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");
}
}
}
}
然后我尝试在这里调用每个按钮
@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>
起初,我想访问我需要使用 generateViewId() 的每个按钮,但是 ID 取决于按钮在 XML 中的位置。
然后我读到需要 setTag - 但是现在我对如何实现它并在 onClick 内的单个按钮中访问它感到困惑。
任何帮助将不胜感激。
【问题讨论】:
-
好吧,您的解决方案似乎可行,但我会有点长:当您将数据从片段 B 发送到 A 时,请通过您的活动来完成,这是专业的做法。然后,当您获得按钮数据列表时,通过循环对它们中的每一个进行膨胀。此外,在循环时,通过该按钮的数据库中的 id 将 OnclickListener 设置为每个按钮。然后在另一种接收点击命令的方法中,用你的按钮做你想做的事,因为来自 db 的 id 将通过该 id 获取你需要的所有数据
-
@SA 你能在下面检查我的方法吗?
标签: android android-layout buttonclick