在运行期间无法正确更新RelativeLayout位置

问题描述:

我想在编程的运行期间将视图的位置Relative更改为其父项。我创建了一个Spinner来选择和更改TextView的位置。我的策略是重置所有可能的规则(例如params.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0)),然后添加我选择的必要规则。但是,除了三种情况,TextView已被放置在错误的位置。下面是选择和对策:在运行期间无法正确更新RelativeLayout位置

  • 左上 - >左上(正常工作)
  • 首页中心 - >左上
  • 右上 - >左上
  • 左中 - >底左
  • 中右键 - >左下
  • 左下 - >左下(正常工作)
  • 底部中心 - >右下
  • 右下 - >右下(工作正常)

我在做什么错?

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); 
    } 
} 
+0

你有没有尝试在XML中使用?尝试使用XML创建简单的用例。完成后,然后以编程方式尝试。 –

+0

将您的源代码发布到github中,然后我可以看到您的代码并稍后进行修复。 –

+0

@radityagumay我可以在没有问题的情况下使用XML,但为了能够在运行时更改它,它需要以程序方式更新。这是我在这个应用程序中编写的所有代码,无需上传到GitHub。你可以很容易地复制这个只需使用这个帖子 – Naci

这就是当你忽视最简单的事情会发生什么。我忘了在每个案例的结尾处放置break语句。