以编程方式对齐视图
Align views programmatically
我正在尝试以编程方式创建一个 contentView,但我无法理解为什么以下代码无法按我的意愿运行。这是代码:
public class UserProfile extends AppCompatActivity {
ScrollView scrollView;
LinearLayout contentnView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
ServerRequest serverRequest = new ServerRequest(this);
final String userid = intent.getStringExtra(PostPopUp.EXTRA_USER_PROFILE_ID);
serverRequest.getUserPostsInBackground(userid, new GetCallback() {
@Override
public void done(ArrayList<Document> docs) {
contentnView = new LinearLayout(UserProfile.this);
contentnView.setOrientation(LinearLayout.VERTICAL);
setContentView(contentnView);
RelativeLayout relativeLayoutWithView = new RelativeLayout(UserProfile.this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
relativeLayoutWithView.setLayoutParams(params);
relativeLayoutWithView.setPadding(16, 16, 16, 16);
relativeLayoutWithView.setBackgroundColor(Color.WHITE);
FacebookSdk.sdkInitialize(getApplicationContext());
ProfilePictureView profilePictureView = new ProfilePictureView(UserProfile.this);
profilePictureView.setProfileId(userid);
profilePictureView.setId(View.generateViewId());
final HashMap<Integer, View> lines = new HashMap<>();
int i = 0;
for (Document post : docs) {
lines.put(i, new View(UserProfile.this));
i++;
}
RelativeLayout.LayoutParams paramsProfileImg = new RelativeLayout.LayoutParams(170, 170);
paramsProfileImg.addRule(RelativeLayout.CENTER_HORIZONTAL, 1);
relativeLayoutWithView.addView(profilePictureView, paramsProfileImg);
for (int j = 0; j < textViews.size(); j++) {
RelativeLayout.LayoutParams paramsLine = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 1);
if (j == 0) {
paramsLine.addRule(RelativeLayout.BELOW, profilePictureView.getId());
} else {
paramsLine.addRule(RelativeLayout.BELOW, lines.get(j - 1).getId());
}
paramsLine.setMargins(0, 16, 0, 0);
lines.get(j).setLayoutParams(paramsLine);
relativeLayoutWithView.addView(lines.get(j), paramsLine);
}
scrollView = new ScrollView(UserProfile.this);
scrollView.addView(relativeLayoutWithView);
contentnView.addView(scrollView);
}
});
}
}
我想要的是第一个视图(就像 hr btw 一样只是一行)在个人资料图片视图下方对齐(它确实如此),而其他视图则在另一个视图下方对齐。实际发生的是第一个视图在个人资料图片视图下方对齐,所有其他视图都堆叠到屏幕的开头。
有什么想法吗?
.. serverRequest.getUserPostsInBackground 只是一个 AsynkTask
由于您使用的是相对布局,因此您应该将要添加的每个新视图对齐到预先添加的视图下。
我认为你正在这样做我不确定,因为我不知道 lines 字段用于什么(视图列表?),以防万一 - 尝试并显式设置每个 id您创建的新视图,我怀疑它们都添加到顶部,因为 id 字段是 0 或类似的东西,所以您使用的布局参数是无用的(即它们都在视图下与 id -1 或 0 对齐,因为它们只完成创建整个视图的操作后获取 ID)
我正在尝试以编程方式创建一个 contentView,但我无法理解为什么以下代码无法按我的意愿运行。这是代码:
public class UserProfile extends AppCompatActivity {
ScrollView scrollView;
LinearLayout contentnView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
ServerRequest serverRequest = new ServerRequest(this);
final String userid = intent.getStringExtra(PostPopUp.EXTRA_USER_PROFILE_ID);
serverRequest.getUserPostsInBackground(userid, new GetCallback() {
@Override
public void done(ArrayList<Document> docs) {
contentnView = new LinearLayout(UserProfile.this);
contentnView.setOrientation(LinearLayout.VERTICAL);
setContentView(contentnView);
RelativeLayout relativeLayoutWithView = new RelativeLayout(UserProfile.this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
relativeLayoutWithView.setLayoutParams(params);
relativeLayoutWithView.setPadding(16, 16, 16, 16);
relativeLayoutWithView.setBackgroundColor(Color.WHITE);
FacebookSdk.sdkInitialize(getApplicationContext());
ProfilePictureView profilePictureView = new ProfilePictureView(UserProfile.this);
profilePictureView.setProfileId(userid);
profilePictureView.setId(View.generateViewId());
final HashMap<Integer, View> lines = new HashMap<>();
int i = 0;
for (Document post : docs) {
lines.put(i, new View(UserProfile.this));
i++;
}
RelativeLayout.LayoutParams paramsProfileImg = new RelativeLayout.LayoutParams(170, 170);
paramsProfileImg.addRule(RelativeLayout.CENTER_HORIZONTAL, 1);
relativeLayoutWithView.addView(profilePictureView, paramsProfileImg);
for (int j = 0; j < textViews.size(); j++) {
RelativeLayout.LayoutParams paramsLine = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 1);
if (j == 0) {
paramsLine.addRule(RelativeLayout.BELOW, profilePictureView.getId());
} else {
paramsLine.addRule(RelativeLayout.BELOW, lines.get(j - 1).getId());
}
paramsLine.setMargins(0, 16, 0, 0);
lines.get(j).setLayoutParams(paramsLine);
relativeLayoutWithView.addView(lines.get(j), paramsLine);
}
scrollView = new ScrollView(UserProfile.this);
scrollView.addView(relativeLayoutWithView);
contentnView.addView(scrollView);
}
});
}
}
我想要的是第一个视图(就像 hr btw 一样只是一行)在个人资料图片视图下方对齐(它确实如此),而其他视图则在另一个视图下方对齐。实际发生的是第一个视图在个人资料图片视图下方对齐,所有其他视图都堆叠到屏幕的开头。
有什么想法吗?
.. serverRequest.getUserPostsInBackground 只是一个 AsynkTask
由于您使用的是相对布局,因此您应该将要添加的每个新视图对齐到预先添加的视图下。
我认为你正在这样做我不确定,因为我不知道 lines 字段用于什么(视图列表?),以防万一 - 尝试并显式设置每个 id您创建的新视图,我怀疑它们都添加到顶部,因为 id 字段是 0 或类似的东西,所以您使用的布局参数是无用的(即它们都在视图下与 id -1 或 0 对齐,因为它们只完成创建整个视图的操作后获取 ID)