FragmentActivity 中的 Nullpointer 异常,同时在 Spinner 中显示来自数据库的数据
Posted
技术标签:
【中文标题】FragmentActivity 中的 Nullpointer 异常,同时在 Spinner 中显示来自数据库的数据【英文标题】:Nullpointer Exception in FragmentActivity while showing data in Spinner from database 【发布时间】:2014-02-02 13:05:48 【问题描述】:我在 FrameActivity 中使用 FragmentPagerAdapter 声明我的可滑动标签时遇到问题。在其中一个选项卡中包含 Spinner,我想在其中从数据库中收集数据。首先我要发布我的 FrameActivity
public class TranscationMain extends FragmentActivity implements
ActionBar.TabListener
Context context;
private ViewPager viewPager;
Spinner spinner_question ;
ContentValues values;
SQLiteDatabase sql_lite_db_obj;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
Cursor cursor;
int i =0;
// Tab titles
private String[] tabs = "Shipped In", "shipped Out", "New Entry" ;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.transcation_main);
androidContext.setContext(this);
sql_lite_db_obj = DatabaseHelper.getInstance().getDb();
values = new ContentValues();
// Initilization
context = this;
viewPager = (ViewPager) findViewById(R.id.pager);
actionBar = getActionBar();
mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(mAdapter);
actionBar.setHomeButtonEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
spinner_question = (Spinner)findViewById(R.id.spinner_category);
// Adding Tabs
for (String tab_name : tabs)
actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
@Override
public void onPageSelected(int position)
actionBar.setSelectedNavigationItem(position);
@Override
public void onPageScrolled(int arg0, float arg1, int arg2)
@Override
public void onPageScrollStateChanged(int arg0)
);
@Override
public void onTabReselected(Tab arg0, FragmentTransaction arg1)
// TODO Auto-generated method stub
@Override
public void onTabSelected(Tab arg0, FragmentTransaction arg1)
// TODO Auto-generated method stub
viewPager.setCurrentItem(arg0.getPosition());
@Override
public void onTabUnselected(Tab arg0, FragmentTransaction arg1)
// TODO Auto-generated method stub
public void clickHandler(View v)
if (v.getId() == R.id.btn_new_category_id)
// btn click event that define in NewEntry.java calss
// click on this button alert dialog will open with editext
// from where i insert data in database. which i have to show in
// spinner which define in same activity. Insertion of data is
// done successfully.
private void insertData(String category)
// method to insert data in database
// working fine
现在这是上面代码的异常部分
private void loadSpinnerData()
DatabaseHelper db = new DatabaseHelper(getApplicationContext());
List<String> lables = db.getAllLabels();
System.out.println(" data in array : "+lables);
// Creating adapter for spinner
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, lables);
System.out.println(" dapater : "+dataAdapter);
// Drop down layout style - list view with radio button
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// attaching data adapter to spinner
spinner_question.setAdapter(dataAdapter);
我想在这个块中调用这个方法
if (v.getId() == R.id.btn_new_category_id)
loadSpinnerData()
但我总是得到一个 NullPointer Exception 。只是因为
的初始化 spinner_question = (Spinner)findViewById(R.id.spinner_category);
Spinner 没有定义在上面 TranscationMain 的布局中,它定义在下面的 Fragment 中
public class NewEntry extends Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
spnr = new Spinner(getActivity());
View rootView = inflater.inflate(R.layout.new_entry, container, false);
return rootView;
这就是为什么我在下面的行中遇到异常。
spinner_question.setAdapter(dataAdapter);
现在我不明白我该如何解决这个问题。如何在 Fragment 的微调器中绑定数据。我是片段活动的新手。在此先感谢大家
【问题讨论】:
【参考方案1】:Spinner is not define in above TranscationMain's layout, It define in below Fragment
这就是崩溃的原因。
findViewById
在当前的膨胀布局中查找视图。
如果微调器在片段中,您需要在片段中初始化相同,然后将项目从数据库加载到片段中的微调器。
在片段中
Spinner spinner_question;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
View rootView = inflater.inflate(R.layout.new_entry, container, false);
spinner_question = (Spinner)rootView.findViewById(R.id.spinner_category);
return rootView;
【讨论】:
@Raghunandan.. 当我试图在 Fragment 中定义微调器时,findViewById 不起作用。那么我将如何将 xml 中的微调器与 java 文件绑定。? @Raghunandan...Spinner spnr; spnr = new Spinner(getActivity()); loadSpinnerData();私有 void loadSpinnerData() DatabaseHelper db = new DatabaseHelper(getActivity());列表ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_item, lables);
。 this
指的是片段而不是活动上下文
@BlueGreen 现在发生了什么??以上是关于FragmentActivity 中的 Nullpointer 异常,同时在 Spinner 中显示来自数据库的数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 FragmentActivity 中的 viewPager 更改方向
FragmentActivity 中的 Nullpointer 异常,同时在 Spinner 中显示来自数据库的数据
尽管 setHasOptionsMenu(true),ActionBar 图标不会显示在 FragmentActivity