2014-09-04 36 views
0

我學習紗廠在Android和我已經測試出現在Android開發者的這個鏈接的代碼簡單的微調: http://developer.android.com/guide/topics/ui/controls/spinner.html錯誤與Android

但它不工作,這些都是文件:

MainActivity.java

... 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Spinner spinner = (Spinner) findViewById(R.id.planets_spinner); 
    // Create an ArrayAdapter using the string array and a default spinner layout 
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
      R.array.planets_array, android.R.layout.simple_spinner_item); 
    // Specify the layout to use when the list of choices appears 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    // Apply the adapter to the spinner 
    spinner.setAdapter(adapter); 
    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.container, new PlaceholderFragment()) 
       .commit(); 
    } 
} 
... 

fragment_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.example.spinners.MainActivity$PlaceholderFragment" > 

<Spinner 
    android:id="@+id/planets_spinner" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 

的strings.xml

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

<string name="app_name">Spinners</string>  
<string name="action_settings">Settings</string> 
<string-array name="planets_array"> 
    <item>Mercury</item> 
    <item>Venus</item> 
    <item>Earth</item> 
    <item>Mars</item> 
    <item>Jupiter</item> 
    <item>Saturn</item> 
    <item>Uranus</item> 
    <item>Neptune</item> 
</string-array> 

當我嘗試應用程序顯示一些錯誤:

E/AndroidRuntime(1381): FATAL EXCEPTION: main 
Process: com.example.spinners, PID: 1381 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.spinners/com.example.spinners.MainActivity}: java.lang.NullPointerException 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
    at android.app.ActivityThread.access$800(ActivityThread.java:135) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5017) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at com.example.spinners.MainActivity.onCreate(MainActivity.java:28) 
    at android.app.Activity.performCreate(Activity.java:5231) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
    ... 11 more 

第28行是:

spinner.setAdapter(adapter); 

你能解釋一下爲什麼它現在在工作嗎?謝謝!

+0

你有沒有得到它的工作? – geekCode 2014-09-05 00:25:03

回答

0

謝謝您的回答@maraci,這是解決方案:

用於填充微調的代碼必須放在片段的類中,在onCreateView方法,所以MainActivity.java看起來是這樣的:

public class MainActivity extends ActionBarActivity { 

    @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(); 
     }     
    }   

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    /** 
    * A placeholder fragment containing a simple view. 
    */ 
    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); 

      Spinner spinner = (Spinner) rootView.findViewById(R.id.planets_spinner);    
      ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),R.array.planets_array, android.R.layout.simple_spinner_item);    
      adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);   
      spinner.setAdapter(adapter); 

      return rootView; 
     }     
    } 
} 
0

您當前所加載的佈局activity_main.xml中:

setContentView(R.layout.activity_main); 

但你的微調器稱爲fragment_main.xml

改變佈局定義

setContentView(R.layout.activity_main); 

setContentView(R.layout.fragment_main); 

編輯: 根據評論,似乎這個問題是,你沒有加載你的片段,然後嘗試從你的活動訪問其xml佈局中的元素。

+0

感謝你的理解,但是MainActivity.java中還有其他一些方法來管理佈局「activity_main」和「fragment_main」,如果我將註釋放在Spinner中的代碼工作,但是使用空的Spinner,那麼錯誤正在填充微調。 – 2014-09-04 22:29:40

+0

對不起,我想我只是不確定你目前的Activity/Fragment設置是什麼。 我相信根據你問題中的信息,問題是findViewById(R.id.planets_spinner)返回null。對我來說,這似乎是因爲包含在xml中的旋轉器的視圖永遠不會被加載,並且您的活動不知道任何事情。 你是什麼意思「如果我把評論代碼填充微調工程」?評論代碼? – maraci 2014-09-05 15:31:28

+0

此外,您可能會在稍後的活動生命週期中加載您的片段代碼。如果是這樣的話,那麼當你試圖找到微調器時,你會得到一個空返回值,因爲這個片段還沒有被加載。確保先加載片段,然後在你的微調器上使用findViewById。 – maraci 2014-09-05 15:36:33