添加 Android 按钮以动态查看
Adding Android buttons to view dynamically
我已经查看了以下问题和其他一些问题:How to add a button dynamically in Android?
我有 2 个带有片段的活动。每次用户在第二个 activity 上按下按钮时,他们都会被重定向到主按钮 activity 并向页面添加一个按钮。即使按钮在 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);
}
}
}
主要活动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>
新创意按钮将他们带到第二个 activity,在那里他们创建了添加到主 activity 的按钮。知道为什么实际上只显示最近的按钮吗?当我调试时,所有按钮都显示在 ideas 数组中。
每次调用 onCreate() 时,特别是调用 setContentView() 时,您的整个布局都会被清除并加载 R.layout.activity_main。
您只看到最近的按钮的原因是因为您最多只在 onCreate() 中添加一个按钮。按钮的位置发生偏移,因为您是根据 ideas 数组中的按钮数量计算它的 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);
}
您有一个 RelativeLayout 作为 parent。这意味着,你必须告诉 children 它们应该在哪里,你可以用
来做到这一点
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, no good start. Try this http://windrealm.org/tutorials/android/android-listview.php 上这样做。只需将 planets 数组与您的 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);
}
}
我已经查看了以下问题和其他一些问题:How to add a button dynamically in Android?
我有 2 个带有片段的活动。每次用户在第二个 activity 上按下按钮时,他们都会被重定向到主按钮 activity 并向页面添加一个按钮。即使按钮在 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);
}
}
}
主要活动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>
新创意按钮将他们带到第二个 activity,在那里他们创建了添加到主 activity 的按钮。知道为什么实际上只显示最近的按钮吗?当我调试时,所有按钮都显示在 ideas 数组中。
每次调用 onCreate() 时,特别是调用 setContentView() 时,您的整个布局都会被清除并加载 R.layout.activity_main。
您只看到最近的按钮的原因是因为您最多只在 onCreate() 中添加一个按钮。按钮的位置发生偏移,因为您是根据 ideas 数组中的按钮数量计算它的 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);
}
您有一个 RelativeLayout 作为 parent。这意味着,你必须告诉 children 它们应该在哪里,你可以用
来做到这一点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, no good start. Try this http://windrealm.org/tutorials/android/android-listview.php 上这样做。只需将 planets 数组与您的 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);
}
}