1

So, I'm using jfeinstein10 library for my SlidingMenu. It works fine but I'm having a problem to toggle the menu when the user taps in one of the menu options.

I have the MainActivty where the slidingmenu is and a fragment called SampleListFragment where I set the menu options.

What I'm trying to do is call a function from the MainActivity when I click the option. This function should only toggle the menu, but instead I get a NullPointException error.

My MainActivity

public class MainActivity extends BaseActivity implements SlidingActivityBase {

private SlidingMenu menu;

private ImageButton btn_pesquisa;
private ImageButton btn_toggle;

private MakeMateria makeMat = new MakeMateria();

private static final int SCREEN_ORIENTATION_PORTRAIT = 1;

String id_test;

SampleListFragment listFragment = new SampleListFragment();

public MainActivity() {
    super(R.string.title_bar_content);
}

public void mainToggle() {
    Log.d("1", "" + this);
    toggle();
    Log.d("2", "" + this);
}

public static Intent newInstance(Activity activity, int pos) {
    Intent intent = new Intent(activity, MainActivity.class);
    intent.putExtra("pos", pos);
    return intent;
}

public void testeEvent(){
    Log.d("Funciona","works");

    toggle();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        BitmapDrawable bg = (BitmapDrawable) getResources().getDrawable(
                R.drawable.titlebar);
        bg.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
        getSupportActionBar().setBackgroundDrawable(bg);

        BitmapDrawable bgSplit = (BitmapDrawable) getResources()
                .getDrawable(R.drawable.titlebar);
        bgSplit.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
        getSupportActionBar().setSplitBackgroundDrawable(bgSplit);
    }

    int pos = 0;
    if (getIntent().getExtras() != null) {
        pos = getIntent().getExtras().getInt("pos");
    }

    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
    getSupportActionBar().setCustomView(R.layout.abs_layout);

    menu = new SlidingMenu(this);
    menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
    menu.setShadowWidthRes(R.dimen.shadow_width);
    menu.setShadowDrawable(R.drawable.shadow);
    menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
    menu.setFadeDegree(0.35f);
    menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
    menu.setBehindScrollScale((float) 1.0);
    menu.setMenu(R.layout.menu_frame);

    // set the Above View
    setContentView(R.layout.content_frame);
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.content_frame, new MainFragment()).commit();

    setSlidingActionBarEnabled(true);

    btn_pesquisa = (ImageButton) findViewById(R.id.btnPesquisa);
    btn_toggle = (ImageButton) findViewById(R.id.btn_menu);

    btn_toggle.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            toggle();

        }
    });

    btn_pesquisa.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(getApplicationContext(),
                    SearchActivity.class);
            //startActivity(intent);
            overridePendingTransition(R.anim.view_transition_in_left,
                    R.anim.view_transition_out_left);
        }
    });
}

public void getMenu(){
    menu.toggle();
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        toggle();
        return true;

    default:
        return super.onOptionsItemSelected(item);
    }
}

}

This part is from my fragment:

@Override
public void onListItemClick(ListView lv, View v, int position, long id) {

    Fragment newContent = null;


    android.support.v4.app.FragmentTransaction transaction = getFragmentManager().beginTransaction();

    switch (position) {
    case 0:
        Log.d("1", "1");        

        getFragmentManager().beginTransaction().replace(R.id.content_frame, new MainFragment()).commit();
        mainActivity.getMenu();

        break;
    case 1:
        Log.d("2", "2");
        toggle();
        break;
    case 2:
        Log.d("3", "3");
        toggle();
        break;
    case 3:
        Log.d("4", "4");
        toggle();
        break;
    case 4:
        Log.d("5", "5");
        toggle();
        break;
    case 5:
        Log.d("6", "6");
        toggle();
        break;
    case 6:
        Log.d("7", "7");
        toggle();
        break;
    case 7:
        Log.d("8", "8");
        toggle();
        break;
    case 8:
        Log.d("9", "9");
        toggle();
        break;
    }
    if (newContent != null)
        switchFragment(newContent);
}

MainActivity mainActivity is global, and the insance of it I did in the onCreateView.

The NPE points to the lines where I call the function and where I call the toggle inside the function.

Many thanks.

Carlos
  • 388
  • 2
  • 13
  • 33
  • It looks like it's because your `SlidingMenu` object is defined in your activity but not in your fragment. If you define your fragment in the same class as your activity, it might work. That or use an interface in your fragment to call back to the activity when you click the list item. – Wenger May 09 '13 at 14:48

1 Answers1

2

I did this -> Android : Accessing container activity object from fragment using putExtra?

The problem was that I passing a null object, but when I did like this ->

((MainActivity) this.getActivity()).getMenu()

I was able to get the correct value from the object.

@Wenger thanks for the help.

Community
  • 1
  • 1
Carlos
  • 388
  • 2
  • 13
  • 33