我已经查看了以下问题以及其他一些问题:How to add a button dynamically in Android?
Dynamically Creating/Removing Buttons in Android
我有两个带片段的活动。每次用户按下第二个活动上的按钮时,它们都会被重定向到主活动,并且会向页面添加一个按钮。即使按钮在数组中的MainActivity中正确保存,但只有最新的按钮显示在布局上,但是它被向下推,好像其他的一样在它上面。
在MainActivity中:
private static List<Button> ideas = new ArrayList<Button>();
private static SharedPreferences sharedPref;
private Context myContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout layout = new RelativeLayout(this);
setContentView(layout, new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Intent intent = getIntent();
Button newIdea = new Button(this);
newIdea.setText("NEW IDEA");
newIdea.setTranslationX(300);
newIdea.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(v.getContext(), NewIdeaPageActivity.class);
startActivity(intent);
}
});
layout.addView(newIdea);
if (intent != null) {
if (intent.hasExtra("title")) {
Button button = new Button(this);
button.setId(ideas.size());
button.setText(getIntent().getStringExtra("title"));
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
if (ideas.size() == 0) {
params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
} else {
params.addRule(RelativeLayout.BELOW, ideas.size() - 1);
}
layout.addView(button, params);
ideas.add(button);
}
}
}
MainActivity xml:
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/fragment"
android:name="com.zarwanhashem.ideatrackr.MainActivityFragment"
tools:layout="@layout/fragment_main" android:layout_width="match_parent"
android:layout_height="match_parent" />
MainActivity片段xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivityFragment"
android:id="@+id/fragment_main_layout">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Idea"
android:id="@+id/new_idea_button"
android:onClick="onNewIdeaButtonClicked"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
新构思按钮将它们带到第二个活动,在那里他们创建添加到主要活动的按钮。知道为什么只显示最近的按钮?我调试时,所有按钮都显示在ideas数组中。
答案 0 :(得分:1)
您有一个RelativeLayout作为父级。这意味着,您必须告诉孩子他们应该在哪里,并且您可以使用例如。
android:layout_alignParentTop
像在xml中一样。 (顺便说一下,其中一些对齐取消了)
阅读http://developer.android.com/reference/android/widget/RelativeLayout.LayoutParams.html
你会发现,还有
android:layout_below
需要ID。
您需要做的是为生成的按钮提供一个ID,可以是一个数字。 然后,您必须向RelativeLayout布局参数添加规则。
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT)
params.addRule(RelativeLayout.BELOW, IDofPreviousButtonComesInHere);
删除那些setTranslations()。
但是,如上所述,请查看ListView(或新的RecyclerView)。
如果你看一下教程,不要在http://developer.android.com/guide/topics/ui/layout/listview.html上这样做,没有好的开始。试试这个http://windrealm.org/tutorials/android/android-listview.php。只需用你的ideas数组和textview xml用一个按钮交换行星数组。它应该工作。
编辑:
试试这个,它有效。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout layout = new RelativeLayout(this);
setContentView(layout, new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
for(int i = 0; i<10; i++) {
Button button = new Button(this);
int id = i+1000;
button.setId(id);
button.setText("Button " + i);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
if(i==0) {
params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
} else {
params.addRule(RelativeLayout.BELOW, id-1);
}
layout.addView(button, params);
}
}
答案 1 :(得分:0)
每次调用onCreate()时,特别是调用setContentView()时,整个布局都会被清除并加载R.layout.activity_main。
您只看到最新按钮的原因是因为您只在onCreate()中添加了最多一个按钮。按钮的位置是偏移的,因为您根据构思数组中的按钮数计算其y位置。
我会做这样的事情:
if (intent != null) {
if (intent.hasExtra("title")) {
ideas.add(new Button(myContext));
ideas.get(ideas.size() - 1).setLayoutParams(new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT));
ideas.get(ideas.size() - 1).setTranslationY(ideas.size() * 100 + 100);
ideas.get(ideas.size() - 1).setText(intent.getStringExtra("title"));
}
}
// add all the buttons to the layout hierarchy
for (Button b : ideas) {
layout.addView(b);
}