【发布时间】:2017-05-27 04:44:46
【问题描述】:
我想在运行时以编程方式将视图的位置Relative 更改为其父级。我创建了一个Spinner 来选择和更改TextView 的位置。我的策略是重置所有可能的规则(例如params.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0)),然后添加我选择所需的必要规则。但是,除了三种情况,TextView 被放置在错误的位置。以下是选择和回应:
- 左上角 -> 左上角(正常工作)
- 顶部中心 -> 左上角
- 右上 -> 左上
- 左中 -> 左下
- 右中 -> 左下
- 左下 -> 左下(正常工作)
- 中下 -> 右下
- 右下 -> 右下(正常工作)
我做错了什么?
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="myapps.test.updateposition.MainActivity">
<Spinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:id="@+id/mySpinner"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/helloWorld"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</RelativeLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView textView = (TextView) findViewById(R.id.helloWorld);
final Spinner mySpinner = (Spinner) findViewById(R.id.mySpinner);
List<String> list = new ArrayList<String>();
//"Top Left","Top Center","Top Right","Middle Left","Middle Right","Bottom Left", "Bottom Center", "Bottom Right"
list.add("Top Left");
list.add("Top Center");
list.add("Top Right");
list.add("Middle Left");
list.add("Middle Right");
list.add("Bottom Left");
list.add("Bottom Center");
list.add("Bottom Right");
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, list);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
mySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
setMyParams(textView, mySpinner.getItemAtPosition(position).toString());
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
public void setMyParams(TextView textView, String position) {
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) textView.getLayoutParams();
// Reset all rules
params.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 0);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0);
params.addRule(RelativeLayout.CENTER_HORIZONTAL, 0);
params.addRule(RelativeLayout.CENTER_VERTICAL, 0);
switch (position) {
case "Top Left":
params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
case "Top Center":
params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
params.addRule(RelativeLayout.CENTER_HORIZONTAL);
case "Top Right":
params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
case "Middle Left":
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
params.addRule(RelativeLayout.CENTER_VERTICAL);
case "Middle Right":
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.CENTER_VERTICAL);
case "Bottom Left":
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
case "Bottom Center":
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
params.addRule(RelativeLayout.CENTER_HORIZONTAL);
case "Bottom Right":
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
}
textView.setLayoutParams(params);
}
}
【问题讨论】:
-
您是否先尝试在 XML 中使用?尝试使用 XML 创建简单的用例。完成后,以编程方式尝试。
-
将你的源代码发布到github,然后我可以看到你的代码并稍后修复它。
-
@radiityagumay 我可以毫无问题地在 XML 中使用,但是为了能够在运行时更改它,它需要以编程方式进行更新。这就是我在这个应用程序中编写的所有代码,无需上传到 GitHub。您只能使用本文中的代码轻松复制它
-
好吧,你忘了使用 break 语句。
标签: android android-layout android-relativelayout