我有一个片段,它从xml文件定义实现RootView。 xml文件有一个名为diceSpinner1的微调器,一个名为radioOddEven1的radionButtonGroup,以及一个执行rollDice活动的按钮。如何在rollDice活动中获取diceSpinner1和radioButtonGroup?
更新:我更改了DestinationsFragment.java并摆脱了RoleDice来解决我的问题。
DestinationsFragment.java
public class DestinationsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.destinations, container, false);
Button button = (Button) rootView.findViewById(R.id.rollDiceButton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
updateDetail();
}
});
return rootView;
}
public void updateDetail() {
setDiceSpinner(3);
setOddEven(1);
}
public void setDiceSpinner(int value) {
Spinner spinner = (Spinner) getView().findViewById(R.id.diceSpinner1);
spinner.setSelection(value);
}
public void setOddEven(int value) {
RadioGroup rg = (RadioGroup) getView().findViewById(R.id.radioOddEven1);
if (value == 0) {
rg.check(R.id.radioOdd1);
}else {
rg.check(R.id.radioEven1);
}
}
}
LogCat输出
11-27 23:19:17.360: D/dalvikvm(2456): GC_FOR_ALLOC freed 85K, 5% free 3138K/3296K, paused 95ms, total 100ms
11-27 23:19:17.400: I/dalvikvm-heap(2456): Grow heap (frag case) to 4.206MB for 1127536-byte allocation
11-27 23:19:17.490: D/dalvikvm(2456): GC_FOR_ALLOC freed 2K, 4% free 4237K/4400K, paused 86ms, total 87ms
11-27 23:19:18.010: I/System.out(2456): android.support.v4.view.ViewPager{b1d50eb0 VFED.... ......I. 0,0-0,0 #7f090000 app:id/pager}
11-27 23:19:18.020: I/System.out(2456): com.android.internal.app.ActionBarImpl$TabImpl@b1d51e30
11-27 23:19:18.020: I/System.out(2456): 0
11-27 23:19:20.160: D/gralloc_goldfish(2456): Emulator without GPU emulation detected.
11-27 23:19:21.620: I/Choreographer(2456): Skipped 110 frames! The application may be doing too much work on its main thread.
11-27 23:19:25.080: D/dalvikvm(2456): GC_FOR_ALLOC freed 98K, 4% free 4652K/4820K, paused 200ms, total 218ms
11-27 23:19:25.470: D/AndroidRuntime(2456): Shutting down VM
11-27 23:19:25.470: W/dalvikvm(2456): threadid=1: thread exiting with uncaught exception (group=0xb1a44b90)
11-27 23:19:25.580: E/AndroidRuntime(2456): FATAL EXCEPTION: main
11-27 23:19:25.580: E/AndroidRuntime(2456): Process: com.njb.rblookup, PID: 2456
11-27 23:19:25.580: E/AndroidRuntime(2456): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.njb.rblookup/com.njb.rblookup.RollDice}: java.lang.NullPointerException
11-27 23:19:25.580: E/AndroidRuntime(2456): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
11-27 23:19:25.580: E/AndroidRuntime(2456): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
11-27 23:19:25.580: E/AndroidRuntime(2456): at android.app.ActivityThread.access$700(ActivityThread.java:135)
11-27 23:19:25.580: E/AndroidRuntime(2456): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
11-27 23:19:25.580: E/AndroidRuntime(2456): at android.os.Handler.dispatchMessage(Handler.java:102)
11-27 23:19:25.580: E/AndroidRuntime(2456): at android.os.Looper.loop(Looper.java:137)
11-27 23:19:25.580: E/AndroidRuntime(2456): at android.app.ActivityThread.main(ActivityThread.java:4998)
11-27 23:19:25.580: E/AndroidRuntime(2456): at java.lang.reflect.Method.invokeNative(Native Method)
11-27 23:19:25.580: E/AndroidRuntime(2456): at java.lang.reflect.Method.invoke(Method.java:515)
11-27 23:19:25.580: E/AndroidRuntime(2456): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
11-27 23:19:25.580: E/AndroidRuntime(2456): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
11-27 23:19:25.580: E/AndroidRuntime(2456): at dalvik.system.NativeStart.main(Native Method)
11-27 23:19:25.580: E/AndroidRuntime(2456): Caused by: java.lang.NullPointerException
11-27 23:19:25.580: E/AndroidRuntime(2456): at com.njb.rblookup.RollDice.onCreate(RollDice.java:23)
11-27 23:19:25.580: E/AndroidRuntime(2456): at android.app.Activity.performCreate(Activity.java:5243)
11-27 23:19:25.580: E/AndroidRuntime(2456): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
11-27 23:19:25.580: E/AndroidRuntime(2456): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
11-27 23:19:25.580: E/AndroidRuntime(2456): ... 11 more
11-27 23:19:37.440: I/Process(2456): Sending signal. PID: 2456 SIG: 9
RollDice.java
public class RollDice extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupActionBar();
View view = (View) findViewById(R.id.destinationsTab);
Spinner spinner = (Spinner) findViewById(R.id.diceSpinner1);
spinner.setSelection(3);
RadioGroup rbg = (RadioGroup) view.findViewById(R.id.radioOddEven1);
rbg.check(R.id.radioEven1);
}
/**
* Set up the {@link android.app.ActionBar}.
*/
private void setupActionBar() {
getActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.roll_dice, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// This ID represents the Home or Up button. In the case of this
// activity, the Up button is shown. Use NavUtils to allow users
// to navigate up one level in the application structure. For
// more details, see the Navigation pattern on Android Design:
//
// http://developer.android.com/design/patterns/navigation.html#up-vs-back
//
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
}
destinations.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/destinationsTab"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RadioGroup
android:id="@+id/radioOddEven1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<RadioButton
android:id="@+id/radioOdd1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/radio_odd"
android:checked="true"
/>
<RadioButton
android:id="@+id/radioEven1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/radio_even" />
</RadioGroup>
<TextView
android:id="@+id/diceLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dice_total_prompt"
/>
<Spinner
android:id="@+id/diceSpinner1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/dice_value_array"
android:prompt="@string/dice_total_prompt" />
<Button
android:id="@+id/rollDiceButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/roll_dice_button"
android:onClick="rollDice"/>
</LinearLayout>
MainActivity.java
public class MainActivity extends FragmentActivity implements
ActionBar.TabListener {
public final static String ODD_EVEN_VALUE = "com.njbRailbaronlookup.ODD_EVEN_VALUE";
public final static String DICE_VALUE = "com.njbRailbaronlookup.DICE_VALUE";
public final static String REGION_VALUE = "com.njbRailbaronlookup.REGION_VALUE";
public final static String CITY_1_VALUE = "com.njbRailbaronlookup.CITY_1_VALUE";
public final static String CITY_2_VALUE = "com.njbRailbaronlookup.CITY_2_VALUE";
private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
// Tab titles
private String[] tabs = { "Destinations", "Payouts" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initilization
viewPager = (ViewPager) findViewById(R.id.pager);
actionBar = getActionBar();
mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(mAdapter);
actionBar.setHomeButtonEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Adding Tabs
for (String tab_name : tabs) {
actionBar.addTab(actionBar.newTab().setText(tab_name)
.setTabListener(this));
}
/**
* on swiping the viewpager make respective tab selected
* */
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// on changing the page
// make respected tab selected
actionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// on tab selected
// show respected fragment view
System.out.println(viewPager);
System.out.println(tab);
System.out.println(tab.getPosition());
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
public void rollDice(View view) {
Intent intent = new Intent(this, RollDice.class);
startActivity(intent);
}
}
DestinationsFragment.java
public class DestinationsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.destinations, container, false);
return rootView;
}
}
答案 0 :(得分:0)
您尝试将RollDice
活动作为正常活动启动,并且您从未通过Intent
传递视图,而未为RollDice活动设置Layout
。因此你会发现错误。
更新:阅读此developer guide了解片段的工作原理。
public class RollDice extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.YOUR_LAYOUT, container, false);
// DO what you want with the RollDice
return rootView;
}
// add other stuff
}
选项卡上的选择将此片段与主FragmentActivity连接。
如果您无法获得,请完成此Tutorial。
答案 1 :(得分:0)
你必须使用setContentView(R.layout.yourlayoutname)在rollDice的onCreate()中设置一个布局,其中包含那些你提到的那些view.Thasts你获得零点异常的原因。