如何在Activity中设置片段中的android屏幕值

时间:2013-11-28 04:23:19

标签: android xml android-fragments tabs

我有一个片段,它从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;
    }
}

2 个答案:

答案 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你获得零点异常的原因。