2014-04-09 69 views
0

下面查找我的所有代碼和xml。我的問題是,由於某些原因我無法確定,並且除了應用程序運行失敗之外,我沒有得到任何錯誤,所以微調器(在代碼spinner1中)爲空。任何幫助,將不勝感激!Android微調控件onselecteditem微調控件是否爲空?

activity_main.xml中:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/black" 
    tools:context=".MainActivity" /> 

MainActivity.java:

package com.example.passwordplayground; 

import java.util.Locale; 

import com.example.MyApplication.EncryptionSpinner; 
import com.example.MyApplication.MyApplication; 

import android.app.ActionBar; 
import android.app.Activity; 
import android.app.FragmentTransaction; 
import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.app.NavUtils; 
import android.support.v4.view.ViewPager; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemSelectedListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends FragmentActivity implements 
     ActionBar.TabListener { 

    /** 
    * The {@link android.support.v4.view.PagerAdapter} that will provide 
    * fragments for each of the sections. We use a 
    * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which 
    * will keep every loaded fragment in memory. If this becomes too memory 
    * intensive, it may be best to switch to a 
    * {@link android.support.v4.app.FragmentStatePagerAdapter}. 
    */ 
    SectionsPagerAdapter mSectionsPagerAdapter; 

    /** 
    * The {@link ViewPager} that will host the section contents. 
    */ 
    ViewPager mViewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Set up the action bar. 
     final ActionBar actionBar = getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     Spinner spinner1 = (Spinner) findViewById(R.id.encryptionSpin); 
     if (spinner1 == null) 
      System.out.println("Spinner1 is null"); 
     else 
      System.out.println("Funcion is null"); 
     spinner1.setOnItemSelectedListener(new EncryptionSpinner()); 

     // Create the adapter that will return a fragment for each of the three 
     // primary sections of the app. 
     mSectionsPagerAdapter = new SectionsPagerAdapter(
       getSupportFragmentManager()); 

     // Set up the ViewPager with the sections adapter. 
     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

     // When swiping between different sections, select the corresponding 
     // tab. We can also use ActionBar.Tab#select() to do this if we have 
     // a reference to the Tab. 
     mViewPager 
       .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
        @Override 
        public void onPageSelected(int position) { 
         actionBar.setSelectedNavigationItem(position); 
        } 
       }); 

     // For each of the sections in the app, add a tab to the action bar. 
     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
      // Create a tab with text corresponding to the page title defined by 
      // the adapter. Also specify this Activity object, which implements 
      // the TabListener interface, as the callback (listener) for when 
      // this tab is selected. 
      actionBar.addTab(actionBar.newTab() 
        .setText(mSectionsPagerAdapter.getPageTitle(i)) 
        .setTabListener(this)); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) { 
     // When the given tab is selected, switch to the corresponding page in 
     // the ViewPager. 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabUnselected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) { 
    } 

    @Override 
    public void onTabReselected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) { 
    } 

    /** 
    * A {@link FragmentPagerAdapter} that returns a fragment corresponding to 
    * one of the sections/tabs/pages. 
    */ 
    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      // getItem is called to instantiate the fragment for the given page. 
      // Return a DummySectionFragment (defined as a static inner class 
      // below) with the page number as its lone argument. 
      Fragment fragment = new DummySectionFragment(); 
      Bundle args = new Bundle(); 
      args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1); 
      fragment.setArguments(args); 
      return fragment; 
     } 

     @Override 
     public int getCount() { 
      // Show 4 total pages. 
      return 4; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      Locale l = Locale.getDefault(); 
      switch (position) { 
      case 0: 
       return getString(R.string.title_section1).toUpperCase(l); 
      case 1: 
       return getString(R.string.title_section2).toUpperCase(l); 
      case 2: 
       return getString(R.string.title_section3).toUpperCase(l); 
      case 3: 
       return ("Practicality").toUpperCase(); 
      } 
      return null; 
     } 
    } 

    /** 
    * A dummy fragment representing a section of the app, but that simply 
    * displays dummy text. 
    */ 
    public static class DummySectionFragment extends Fragment { 
     /** 
     * The fragment argument representing the section number for this 
     * fragment. 
     */ 
     public static final String ARG_SECTION_NUMBER = "section_number"; 

     public DummySectionFragment() { 
     } 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View rootView = null; 
      if (getArguments().getInt(ARG_SECTION_NUMBER)==1) { 
       rootView = inflater.inflate(R.layout.encryption,container, false); 
      } 
      else if (getArguments().getInt(ARG_SECTION_NUMBER)==2) { 
       rootView = inflater.inflate(R.layout.fragment_main_dummy, 
         container, false); 
       TextView dummyTextView = (TextView) rootView 
         .findViewById(R.id.section_label); 
       dummyTextView.setText("I'm second!"); 
      } 
      else if (getArguments().getInt(ARG_SECTION_NUMBER)==3) { 
       //dummyTextView.setText("I'm third"); 
      } 
      else if (getArguments().getInt(ARG_SECTION_NUMBER)==4) { 
       //dummyTextView.setText("I'm fourth and last!"); 
      } 
      return rootView; 
     } 
    } 

} 

encryption.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:android1="http://schemas.android.com/apk/res/android" 
    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=".MainActivity$Encryption" > 

    <Spinner 
     android1:id="@+id/encryptionSpin" 
     android1:layout_width="fill_parent" 
     android1:layout_height="wrap_content" 
     android1:layout_alignParentTop="true" 
     android1:layout_centerHorizontal="true" 
     android1:layout_marginTop="14dp" 
     android1:background="@color/orange" 
     android1:entries="@array/cryptArray" /> 

</RelativeLayout> 

EncryptionSpinner.java:

package com.example.MyApplication; 

import android.view.View; 
import android.widget.AdapterView; 
import android.widget.Toast; 
import android.widget.AdapterView.OnItemSelectedListener; 

public class EncryptionSpinner implements OnItemSelectedListener { 

    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
     // An item was selected. You can retrieve the selected item using 
     // parent.getItemAtPosition(pos) 
     Toast toast = Toast.makeText(MyApplication.getAppContext(), parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG); 
     toast.show(); 
     System.out.println(parent.getItemAtPosition(pos).toString()); 
    } 

    public void onNothingSelected(AdapterView<?> parent) { 
     // Another interface callback 
    } 
} 

logcat的錯誤:

04-09 01:16:28.637: I/System.out(1440): Spinner1 is null 
04-09 01:16:28.657: D/AndroidRuntime(1440): Shutting down VM 
04-09 01:16:28.657: W/dalvikvm(1440): threadid=1: thread exiting with uncaught exception (group=0x414c4700) 
04-09 01:16:28.692: E/AndroidRuntime(1440): FATAL EXCEPTION: main 
04-09 01:16:28.692: E/AndroidRuntime(1440): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.passwordplayground/com.example.passwordplayground.MainActivity}: java.lang.NullPointerException 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at android.os.Looper.loop(Looper.java:137) 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at java.lang.reflect.Method.invoke(Method.java:525) 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at dalvik.system.NativeStart.main(Native Method) 
04-09 01:16:28.692: E/AndroidRuntime(1440): Caused by: java.lang.NullPointerException 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at com.example.passwordplayground.MainActivity.onCreate(MainActivity.java:65) 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at android.app.Activity.performCreate(Activity.java:5133) 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
04-09 01:16:28.692: E/AndroidRuntime(1440):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
04-09 01:16:28.692: E/AndroidRuntime(1440):  ... 11 more 

佈局桂: layouta_main vs encryption

+0

您沒有爲微調器賦予任何值。 – Riser

+0

或其與佈局文件不匹配的id。 – Riser

+0

你試過'view.getContext()'而不是'MyApplication.getAppContext()'嗎? –

回答

0
如果你想用戶微調從activity_main那麼你必須把它在該文件中,因爲現在它不是自己的,它是在

encryption.xml文件。

化妝activity_main.xml中象下面這樣:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:android1="http://schemas.android.com/apk/res/android" 
    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=".MainActivity$Encryption" > 

<android.support.v4.view.ViewPager 

    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/black" 
    tools:context=".MainActivity" /> 

    <Spinner 
     android1:id="@+id/encryptionSpin" 
     android1:layout_width="fill_parent" 
     android1:layout_height="wrap_content" 
     android1:layout_alignParentTop="true" 
     android1:layout_centerHorizontal="true" 
     android1:layout_marginTop="14dp" 
     android1:background="@color/orange" 
     android1:entries="@array/cryptArray" /> 

</RelativeLayout> 
+0

我已經嘗試了您的解決方案,但變量本身仍然爲空。 – Kyle

+0

你也有activity_main xml文件? – Riser

+0

是的,我的問題已經更新,包括它。\ – Kyle

0

你誇大你的活動佈局activity_main和您試圖訪問Spinner這是不是在你的activity_main佈局。

在這一點上,你會得到錯誤。由於Spinner不在您的activity_main佈局中。

所以必須初始化如下您SpinnerDummySectionFragmentonCreateView方法:

public static class DummySectionFragment extends Fragment { 

    public static final String ARG_SECTION_NUMBER = "section_number"; 

    public DummySectionFragment() { 
    } 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = null; 
     if (getArguments().getInt(ARG_SECTION_NUMBER)==1) { 
      rootView = inflater.inflate(R.layout.encryption,container, false); 
       Spinner spinner1 = (Spinner)rootView.findViewById(R.id.encryptionSpin); 
     } 
+0

如果我改變了行setContentView(R.layout.activity_main);在onCreate函數中setContentView(R.layout.encryption);會解決這個問題嗎?雖然根據我的片段標籤代碼,它應該去那裏,因爲它是加載tab1期間infalted。 – Kyle

+0

看看我更新的答案。 – GrIsHu

+0

好吧,我已經添加了你建議的代碼,現在我得到了第68行的空指針:mViewPager.setAdapter(mSectionsPagerAdapter);所以我的猜測是它不喜歡添加到該功能的東西。 – Kyle

0

你看到有空指針異常。 表示您無法控制正在使用的組件。 這可能是由於兩個原因導致的 1.兩個組件具有相同的ID。 2.錯誤定義的佈局。

你的情況

您使用的佈局

R.layout.activity_main 

,而你的佈局名稱是

R.layout.encryption 

改變佈局的名字,你準備好去。

+0

感謝您的評論,我現在已將其更改爲setContentView(R.layout.encryption);.但不幸的是,我仍然收到錯誤,將它留在onCreate中。其他人建議將它移到片段上,但我在另一行上導致了另一個空錯誤。 – Kyle

0

如果您將內容視圖設置爲任何一種xml,則將ViewPager放入activity_mail佈局中並將Spinner放入encryption.xml中。所以任何人都會識別另一個不會被識別的人。它會拋出空指針異常。

R.layout.activity_main having ViewPager

R.layout。加密有Spinner

如果你設置了setcontentView(R.layout.activity_main)那麼findViewById(R.id.encryptionSpin);行會拋出空指針。

如果你設置了setcontentView(R.layout.encryption)那麼mViewPager = (ViewPager) findViewById(R.id.pager);行會拋出空指針。

+0

好的,我該怎麼辦? – Kyle

+0

@Kyle將兩個視圖放在一個xml中,並在setContentView()中設置xml – Yuvaraja

+0

我不能(至少不知道如何),因爲其中一個是調用包含不同選項卡的佈局的默認佈局。它是在項目創建期間由sdk自動生成的。 – Kyle