Android - przycisk nie reaguje na kliknięcie

0

Witam. Robię program z tymi zakładkami (tabami) do przełączania między fragmentami . Mam taki problem w androidzie, że ustawiam przyciskowi listenera, ale gdy go klikam, metoda onClick nigdy się nie wykonuje. Zazwyczaj, kiedy używałem w onCreate setContentView problem nie występował, ale teraz nie używam contentView.
onCreate głównej aktywności wygląda tak:

protected void onCreate(Bundle savedInstanceState) 
{
	super.onCreate(savedInstanceState);
	ViewGroup container = (ViewGroup) findViewById(R.id.container);
	View mainView = getLayoutInflater().inflate(R.layout.frame, container,false);
	
	final ActionBar actionBar = getActionBar();
	actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
		
	fragment1 = new Fragment1();
		
	fragment1_1 = new Fragment1_1();
	fragment1_2 = new Fragment1_2();
	fragment1_3 = new Fragment1_3();
		
	fragment2 = new Fragment2();
		
	fragment3 = new Fragment3();		
		
	tab1 = actionBar.newTab();
	tab1.setText("okno1");
	tab1.setTabListener(new MyTabListener(this, fragment1));
	tab2 = actionBar.newTab();
	tab2.setText("okno2");
	tab2.setTabListener(new MyTabListener(this, fragment2));
	tab3 = actionBar.newTab();
	tab3.setText("okno3");
	tab3.setTabListener(new MyTabListener(this, fragment3));
				
	actionBar.addTab(tab1);
	actionBar.addTab(tab2);
	actionBar.addTab(tab3);
	
	Button welcomeButton =(Button) mainView.findViewById(R.id.button3);
	welcomeButton.setOnClickListener(new ShowHideButtonListener(this, fragment1, 0));
}

layout R.layout.frame jest plikiem xml, w którym dodałem wszystkie pozostałe fragmenty.

tab listener wygląda tak:

private class MyTabListener implements TabListener
{
	private Activity activity;
	private Fragment fragment;
	private Fragment mFragment;
		
	private MyTabListener(Activity activity, Fragment fragment)
	{
		this.activity = activity;
		this.fragment = fragment;
	}
	@Override
	public void onTabReselected(Tab arg0, FragmentTransaction transaction) 
	{
		transaction.replace(R.id.fragment1, fragment);
		transaction.commit();
		
	}

	@Override
	public void onTabSelected(Tab tab, FragmentTransaction transaction) 
	{
		if(mFragment == null)
		{
			mFragment = Fragment.instantiate(activity, fragment.getClass().getName());
			transaction.add(android.R.id.content, mFragment);		
		}
		else
		{
			transaction.attach(mFragment);
		}
	    }
		
	@Override
	public void onTabUnselected(Tab tab, FragmentTransaction transaction) 
	{
		transaction.detach(mFragment);
		if(fragment1_1 != null)
			transaction.detach(fragment1_1);
		if(fragment1_2 != null)
			transaction.detach(fragment1_2);
		if(fragment1_3 != null)
			transaction.detach(fragment1_3);
			
	}
}

natomiast onClickListener wygląda tak:

private class ShowHideButtonListener implements OnClickListener
{
	private Activity activity;
	FragmentTransaction transaction;
	private int i;
		
	private ShowHideButtonListener(Activity activity, Fragment fragment, int i)
	{
		this.activity = activity;
		transaction = activity.getFragmentManager().beginTransaction();
		this.i = i;
		System.out.println("listener konstruktor");
			
	}
		
	@Override
	public void onClick(View arg0) 
	{
		System.out.println("onClick");
//...
}

Co ciekawe tekst "listener konstruktor" się wyświetla, natomiast "onClick" się nie wyświetla jak kliknę przycisk.
Proszę o pomoc.

0

http://jakewharton.github.io/butterknife/
jak zmienisz to za pomocą tej biblioteki to wklej poprawiony kod (jeżeli dalej będziesz miał problem). Druga sprawa, nigdy nie przekazuj aktywności i fragmentów jako parametr funkcji jakiegoś innego obiektu JEŻELI chcesz je przechowywać jako zmienne. Ewentualnie za pomocą WeakReference.

0

Mógłbyś wyjaśnić do czego mi właściwie potrzebna ta biblioteka? ściągnąłem ją i dołączyłem do projektu, ale dalej nie wiem po co... Zmieniłem trochę w kodzie, głównie przekazywanie tych fragmentów. Nie wiem jak inaczej przekazywać aktywność, ale tutaj robią to podobnie http://developer.android.com/guide/topics/ui/actionbar.html/
teraz mam coś takiego, efekt jest dalej ten sam
onCreate:

@Override
	protected void onCreate(Bundle savedInstanceState) 
	{
		super.onCreate(savedInstanceState);
		
		ViewGroup container = (ViewGroup) findViewById(R.id.container);
		View mainView = getLayoutInflater().inflate(R.layout.frame, container,false);
		
		final ActionBar actionBar = getActionBar();
		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
		
		tab1 = actionBar.newTab();
		tab1.setText("okno1");
		tab1.setTabListener(new MyTabListener<Fragment1>(this, Fragment1.class));
		tab2 = actionBar.newTab();
		tab2.setText("okno2");
		tab2.setTabListener(new MyTabListener<Fragment2>(this, Fragment2.class));
		tab3 = actionBar.newTab();
		tab3.setText("okno3");
		tab3.setTabListener(new MyTabListener<Fragment3>(this, Fragment3.class));
		
		actionBar.addTab(tab1);
		actionBar.addTab(tab2);
		actionBar.addTab(tab3);
		
		welcomeButton =(Button) mainView.findViewById(R.id.button3);
		welcomeButton.setOnClickListener(new ShowHideButtonListener(this, 0));
	}

TabListener:

private static class MyTabListener<T extends Fragment> implements TabListener
	{
		private final Activity activity;
		private final Class<T> fragmentClass;
		private Fragment mFragment;
		
		private MyTabListener(Activity activity, Class<T> fragmentClass)
		{
			this.activity = activity;
			this.fragmentClass = fragmentClass;
		}
		@Override
		public void onTabReselected(Tab arg0, FragmentTransaction transaction) 
		{
		}

		@Override
		public void onTabSelected(Tab tab, FragmentTransaction transaction) 
	    {
			if(mFragment == null)
			{
				mFragment = Fragment.instantiate(activity, fragmentClass.getName());
				transaction.add(android.R.id.content, mFragment);
				
			}
			else
			{
				transaction.attach(mFragment);
			}
	    }
		
		@Override
		public void onTabUnselected(Tab tab, FragmentTransaction transaction) 
		{
			if(mFragment != null)
				transaction.detach(mFragment);
		}
	}

OnClickListener:

private class ShowHideButtonListener implements OnClickListener
	{
		private Activity activity;
		FragmentTransaction transaction;
		private int i;
		
		private ShowHideButtonListener(Activity activity, int i)
		{
			transaction = activity.getFragmentManager().beginTransaction();
			this.i = i;
			System.out.println("listener konstruktor");
		}
		
		@Override
		public void onClick(View arg0) 
		{
			System.out.println("onClick");
//...
}
}
0

Już rozwiązałem problem. Zrobiłem teraz defniowanie listenera w klasie fragmentu, a nie w onCreate aktywności i zaczęło działać :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1