2017-05-27 3 views
0

Ich möchte die Position Relative einer Ansicht während der Laufzeit programmgesteuert in ihr übergeordnetes Element ändern. Ich habe einen Spinner erstellt, um die Position eines TextView auszuwählen und zu ändern. Meine Strategie hat alle möglichen Regeln zurückgesetzt (z. B. params.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0)) und dann die erforderlichen Regeln hinzugefügt, die für meine Auswahl erforderlich sind. Mit Ausnahme von drei Fällen wurde die TextView an der falschen Stelle platziert. Hier sind die Auswahl und die Antworten:RelativeLayout-Position kann während der Laufzeit nicht korrekt aktualisiert werden

  • Oben links -> Oben links (Arbeiten korrekt)
  • Top-Center -> Oben links
  • Top Right -> Oben links
  • Mitte links -> Bottom linke
  • Mitte Rechts -> unten links
  • unten links -> unten links (Arbeits richtig)
  • unten Mitte -> unten rechts
  • Unten rechts -> Unten rechts (Funktioniert einwandfrei)

Was mache ich falsch?

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

Haben Sie versucht zuerst in XML zu verwenden? Versuchen Sie, einen einfachen Anwendungsfall mit XML zu erstellen. nachdem Sie fertig sind, dann versuchen Sie es auf programmatische Weise. –

+0

Poste den Quellcode in github, dann sehe ich den Code und behebe ihn später. –

+0

@radityagumay Ich kann in XML ohne Probleme verwenden, aber um es während der Laufzeit ändern zu können, muss es auf eine programmatische Art und Weise aktualisiert werden. Und das ist der ganze Code, den ich in dieser Anwendung geschrieben habe, keine Notwendigkeit, auf GitHub hochzuladen. Sie können dies einfach replizieren, nur indem Sie den Code in diesem Beitrag verwenden – Naci

Antwort

0

Das ist, was passiert, wenn man die einfachste Sache übersehen. Ich habe vergessen, die break-Anweisung am Ende jedes Falles zu setzen.

Verwandte Themen