2014-10-17 3 views
0

항목 옵션을 사용하여 xml 파일의 항목으로 회 전자를 채 웁니다. 주 활동 클래스의 회 전자를 "s1"로 정의했습니다. 디버그 모드에서 나는 s1이 null이라는 것을 발견했다. 이것이 setOnItemSelectedListener가 회 전자에 대해 작동하지 않는 이유입니다. 항목을 선택하면 토스트 메시지가 표시되지 않습니다. mainactivity.java, activity_main.xml 및 strings.xml 파일을 제공하고 있습니다.주 활동에 정의 된 회 전자가 null입니다.

MainActivity.java

public class MainActivity extends ActionBarActivity{ 
String[] presidents; 
@Override 
protected void onCreate(Bundle savedInstanceState){ 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 


if (savedInstanceState == null) { 
getSupportFragmentManager().beginTransaction() 
.add(R.id.container, new PlaceholderFragment()) 
.commit(); 
} 

presidents = getResources().getStringArray(R.array.presidents); 

Spinner s1 = (Spinner) findViewById(R.id.spinner1); 


ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
R.array.presidents, android.R.layout.simple_spinner_item); 

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
if(s1 != null){ 
s1.setAdapter(adapter); 

s1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 


public void onItemSelected(AdapterView<?> arg0, 
View arg1, int arg2, long arg3) 
{ 
int index = arg0.getSelectedItemPosition(); 
Toast.makeText(getBaseContext(), presidents[index], Toast.LENGTH_SHORT).show(); 

} 
public void onNothingSelected(AdapterView<?> arg0){ 

} 
}); 
} 


} 
public static class PlaceholderFragment extends Fragment { 

    public PlaceholderFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
     return rootView; 
    } 
} 

activity_main.xml

<?xml version="1.0" encoding="UTF-8"?> 

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

<Spinner 
android:id="@+id/spinner1" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:drawSelectorOnTop= "true" 
android:entries="@array/presidents" /> 

strings.xml의

<resources> 
<string-array name = "presidents"> 
<item>eisenhower</item> 
<item>kennedy</item> 
</string-array> 
</resources> 
+0

지수는 유 된 setContentView를 사용하여 r에 – ashutiwari4

+0

(R.layout.activity_main) ARG2해야한다; 하지만 게시 XML fragment_main.xml –

+0

위의 코드에서 placeholderFragment 클래스의 fragment_main.xml을 사용하고 있습니다 – user3715224

답변

0

는 사용 R.layout.fragment_main 대신

+0

placeholderFragment 클래스에서 R.layout.fragment_main을 사용하고 있습니다. – user3715224

+0

예,'activity_main'이 아닌'fragment_main'에있는'spinner1'에 대해'findViewById'를 할 때 당신의 주 활동은'activity_main.xml'에 의해 팽창됩니다. 'null'이 리턴됩니다. 조각의'onCreateView()'에'회 전자'코드를 넣으십시오. –

+0

감사합니다. 문제가 해결되었습니다. – user3715224

0

이 방법을 시도,이 뜻을 희망 문제를 해결하는 데 도움이됩니다.

activity_main.xml

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

    <Spinner 
     android:id="@+id/spinner1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

MainActivity.java 당신의 setContentView(R.layout.activity_main);이 잘못

public class MainActivity extends ActionBarActivity { 

    private Spinner s1; 
    private String[] presidents; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     s1 = (Spinner) findViewById(R.id.spinner1); 
     presidents = getResources().getStringArray(R.array.presidents); 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.presidents, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

     if(s1 != null){ 
      s1.setAdapter(adapter); 
      s1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
       public void onItemSelected(AdapterView<?> arg0,View arg1, int arg2, long arg3) 
       { 
        Toast.makeText(MainActivity.this, presidents[arg2], Toast.LENGTH_SHORT).show(); 

       } 
       public void onNothingSelected(AdapterView<?> arg0){ 

       } 
      }); 
     } 
    } 
} 
+0

디버그 모드에서 s1이 null 인 것을 발견했습니다. s1의 값을 설정하는 방법. – user3715224

0

당신은 클래스 수준에서 스피너를 초기화 한 . 이 시점에서 Spinner 객체는 null입니다. 대신 onCreate() 메서드 내에서 Spinner를 초기화해야합니다. 그래서 당신은 이런 식으로이있을 수 있습니다

Spinner s1; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); // Only here is the layout inflated and only after this can Android see the Spinner 

    s1 = (Spinner) findViewById(R.id.spinner); 
    // Other statements 
} 
관련 문제