Spinner отображает неправильное значение - PullRequest
1 голос
/ 10 октября 2010

У меня есть простая программа, в которой я устанавливаю счетчик в положение. Затем я вызываю второй модуль и, когда возвращаюсь, сбрасываю счетчик. Дисплей счетчика не отображает значение счетчика. Когда вы нажимаете на счетчик, он указывает на правильное значение, но отображает неправильное значение. На самом деле, он фактически уходит вниз.

Я написал следующую простую программу для демонстрации. Это происходит только в том случае, если у формы есть спиннер в Linearlayout или TableLayout с другим элементом по крайней мере 1.

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
  <TextView  
    android:layout_width="fill_parent" android:layout_height="200dp"
    android:text="Main Form" />

  <LinearLayout android:id="@+id/widget43" 
    android:layout_width="320dp" android:layout_height="wrap_content"
    android:orientation="horizontal" >
    <Button
        android:id="@+id/btn" android:text="Button" android:textSize="16sp"    
        android:layout_width="160dp" android:layout_height="40dp" />
    <Spinner
        android:id="@+id/btnFour" android:textSize="16sp"    
        android:layout_width="160dp" android:layout_height="40dp"    />
  </LinearLayout>       
</LinearLayout>

next.xml

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <TextView android:id="@+id/id1" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Next"
        />
</LinearLayout>

main.java

package tt.zzz;

import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;

public class main extends Activity {

 @Override
 protected void onCreate(Bundle icicle) 
 {
     super.onCreate(icicle);     
     setContentView(R.layout.main);    
     fillSpinner();

     Button btnGo = (Button) findViewById(R.id.btn);
  btnGo.setOnClickListener(new Button.OnClickListener() {
   public void onClick(View v) { Go(); } });
 }

 void Go() {
  Intent i = new Intent(this, next.class );
  startActivityForResult( i, 0 );
 }

 public void fillSpinner(){
  Spinner spin_test = (Spinner) findViewById( R.id.btnFour );

  ArrayAdapter<CharSequence> myAdapter =
   new ArrayAdapter<CharSequence>(
    this,
    android.R.layout.simple_spinner_item
    );
  myAdapter.setDropDownViewResource(
                    android.R.layout.simple_spinner_dropdown_item);  

  myAdapter.add("Option 1" );
  myAdapter.add("Option 2" );
  myAdapter.add("Option 3" );

  spin_test.setAdapter(myAdapter);
  spin_test.setSelection(1);

  spin_test.setOnItemSelectedListener( 
                new Spinner.OnItemSelectedListener(){
                public void onItemSelected(AdapterView<?> 
                          arg0,View arg1,int arg2,long arg3){
    }
   public void onNothingSelected(AdapterView<?> arg0) {
   }
  }); 
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode,
            Intent intent) {
  super.onActivityResult(requestCode, resultCode, intent);
  fillSpinner(); 
 }
}

next.java

package tt.zzz;

import android.app.Activity;
import android.os.Bundle;

public class next extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.next);
    }
}

Ответы [ 3 ]

3 голосов
/ 05 августа 2011

После вашего setSelection добавьте следующую строку:

myAdapter.notifyDataSetChanged();
2 голосов
/ 30 марта 2011

Я бы сделал то же самое, что предложил бармалей, за исключением добавления следующего:

@Override
public void onResume()
{
  super.onResume();
  fillSpinner();
}

Причина, по которой это необходимо, заключается в том, что вы запускаете другое действие, поэтому это действие приостановлено.

0 голосов
/ 11 октября 2010

Попробуйте позвонить

@Override
public void onStart()
{
    super.onStart();
    this.fillSpinner();
}

Так как onCreate вызывается только один раз, поэтому для обновления Spinner каждый раз необходимо обновлять его где-то еще.onStart () - подходящее место для этого

...