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);
}
}
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. –
Poste den Quellcode in github, dann sehe ich den Code und behebe ihn später. –
@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