【问题标题】:Cannot update RelativeLayout position correctly during runtime在运行时无法正确更新 RelativeLayout 位置
【发布时间】: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


【解决方案1】:

当您忽略最简单的事情时,就会发生这种情况。我忘了把 break 语句放在每个 case 的末尾。

【讨论】:

    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2012-12-24
    • 2012-04-20
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多