Witam.
Stosunkowo niedawno rozpocząłem programowanie na Androida. Obecnie próbuję napisać swoją prostą aplikację (aha, piszę jeszcze niestety w Javie jak coś). Moja aplikacja działa w taki sposób, żę mam jakby gówną aktywność, w której dynamicznie podmieniam fragmenty (FragmentManager i te sprawy). Problem pojawił się w momencie, w którym jeden z fragmentów ma EditText'y no i jak wyświetla się klawiatura - to pod warunkiem, że użytkownik nie naciśnie "done" - gdy przejdzie do innego fragmentu (podmienie fragment) klawiatura się nie zamyka, zasłaniająć część innego fragmentu. Moje pytanie brzmi - jak powinno się to zrobić, żeby klawiatura zamykała się przy przejściu do innego fragmentu, a otwierała (pod warunkiem że była otwarta przy zamknięciu) po powrocie do tego fragmentu (a i klawisz "done" znika też przy przejściu do innego fragmentu - ale dodanie go (co bym chyba potrafił) nic nie zmieni)?
Ogólnie myślałem o metodach onStop i onResume ale nie jest to chyba dobre wyjście.
Pomoże ktoś, bo moje doświadczenie jest aktualnie dosyć nikłe?
Poniższy kod jest z pewnością daleki od doskonałości (i optymalności) ale mam nadzieję, że ktoś zdoła mi trochę pomóc. A i KONSTRUKTYWNĄ krytykę odnośnie kodu też lubię. ;)
Z góry dzięki.
Poniżej XML z layoutem tego fragmentu (chyba tutaj nie potrzebny bo trzeba to zrobić kodem?)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.TextInputLayout
android:id="@+id/frameLayout"
android:layout_width="210dp"
android:layout_height="40dp"
android:layout_alignLeft="@+id/pic_preview"
android:layout_alignStart="@+id/pic_preview"
android:layout_below="@+id/frameLayout2"
android:layout_marginLeft="49dp"
android:layout_marginStart="49dp"
android:layout_marginTop="36dp">
<EditText
android:id="@+id/edit_text_name"
android:layout_width="@dimen/edit_text_width"
android:layout_height="@dimen/edit_text_height"
android:layout_marginBottom="35dp"
android:hint="@string/not_working"
android:imeOptions="actionDone"
android:inputType="text"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/frameLayout2"
android:layout_width="210dp"
android:layout_height="40dp"
android:layout_alignLeft="@+id/frameLayout"
android:layout_alignParentTop="true"
android:layout_alignStart="@+id/frameLayout"
android:layout_marginTop="35dp">
<EditText
android:id="@+id/editText"
android:layout_width="@dimen/edit_text_width"
android:layout_height="@dimen/edit_text_height"
android:layout_marginBottom="65dp"
android:hint="@string/hint_name"
android:paddingTop="5dp"
android:imeOptions="actionDone"
android:inputType="text"/>
</android.support.design.widget.TextInputLayout>
<ImageView
android:id="@+id/pic_preview"
android:layout_width="110dp"
android:layout_height="110dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:src="@drawable/android"
android:layout_marginLeft="22dp"
android:layout_marginStart="22dp" />
<Button
android:id="@+id/chose_pic"
android:layout_width="110dp"
android:layout_height="45dp"
android:layout_alignLeft="@+id/pic_preview"
android:layout_alignStart="@+id/pic_preview"
android:layout_below="@+id/pic_preview"
android:layout_toLeftOf="@id/chose_pic"
android:layout_marginTop="13dp" />
</RelativeLayout>
public class PicsChooserFrag extends Fragment {
private boolean keyboard_on;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle){
RelativeLayout relative=(RelativeLayout)inflater.inflate(R.layout.image_chooser,viewGroup,false);
return relative;
}
//????????????????????????????????????????
public PicsChooserFrag(){
super();
keyboard_on=false;
}
//onStop - when user doesn't see the fragment any more
//onREsume - when user see the fragment once more
@Override
public void onStop(){
super.onStop();
}
@Override
public void onResume(){
super.onResume();
}
}
public class MainActivity extends AppCompatActivity {
// ListView representing options in the drawer
private ListView listViewOfDrawer;
// reference to whole DrawerLayout containing ToolBar, mainFragment and ListView with drawer options
private DrawerLayout wholeDrawer;
private String[]titles; // array representing string shown in drawer
//ActionBarDrawerToggler provides a handy way to tie together the funcionallyty of DrawerLAyout and the framework ActionBar
// "makes the hamburger work"
private ActionBarDrawerToggle drawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
titles=getResources().getStringArray(R.array.title);
//operations concerning ListView with options of drawer
listViewOfDrawer=(ListView)findViewById(R.id.drawer_list_view);
//setting sample content of Drawer using ArrayAdapter
listViewOfDrawer.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_activated_1,titles));
//adding listview listener to the ListView representing "drawer" options
listViewOfDrawer.setOnItemClickListener(new DrawerClickListener());
wholeDrawer=(DrawerLayout)findViewById(R.id.drawerLayout);
getFragmentManager().addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener(){
public void onBackStackChanged(){
FragmentManager fragmentManager=getFragmentManager();
Fragment fragment=fragmentManager.findFragmentByTag("fragment");
if(fragment instanceof PicsFragment ){
// actions when PicsFragment was added
Toast.makeText(getBaseContext(),"PicsFragment",Toast.LENGTH_SHORT).show();//getBaseContext ???
}else if(fragment instanceof PicsChooserFrag){
Toast.makeText(getBaseContext(),"PicsChooserFrag",Toast.LENGTH_SHORT).show();//getBaseContext ???
}
}
}
);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//displaying hamburger button
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// making the hamburger work
drawerToggle=new ActionBarDrawerToggle(this,wholeDrawer,R.string.app_name,R.string.app_name){
@Override
public void onDrawerClosed(View drawerView){
// Toast.makeText(getApplicationContext(),"Zamknieto Menu",Toast.LENGTH_SHORT).show();
super.onDrawerClosed(drawerView);
invalidateOptionsMenu();
}
@Override
public void onDrawerOpened(View drawerView){
// Toast.makeText(getApplicationContext(),"Otworzono Menu",Toast.LENGTH_SHORT).show();
invalidateOptionsMenu();//declare that options menu has changed , so should be redeclared
}
};
wholeDrawer.addDrawerListener(drawerToggle);
drawerToggle.syncState();
}
// implementation of "OnItemClickListViewListener" interface
private class DrawerClickListener implements ListView.OnItemClickListener{
@Override
public void onItemClick(AdapterView<?> praent,View view, int position,long id){
selectItem(position);
}
}
private void selectItem(int position){
Fragment fragmentToPut=null;
switch(position){
case 0:
fragmentToPut=new PicsFragment();
break;
case 1:
fragmentToPut=new PicsChooserFrag();
Toast.makeText(this,"Choosing...", Toast.LENGTH_LONG).show();
break;
default:
fragmentToPut=new PicsFragment();// default
Toast.makeText(this,"Option doesn't work yet :(",Toast.LENGTH_SHORT).show();
}
//we replace the fragment ...
FragmentTransaction fragTran=getFragmentManager().beginTransaction();
fragTran.replace(R.id.main_fragment,fragmentToPut,"fragment");
fragTran.addToBackStack(null);
//selects standard transaction animation for this transaction
fragTran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTran.commit();
//we close the drawer
wholeDrawer.closeDrawer(listViewOfDrawer,false);
}
// this method places menu options to menu
//called only once, the first time the options menu is created
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
Toast.makeText(this,"Options",Toast.LENGTH_SHORT).show();
}else if(id == R.id.author){
Toast.makeText(this,"Author",Toast.LENGTH_SHORT).show();
}else{
//showing menu
Toast.makeText(this,"Menu",Toast.LENGTH_SHORT).show();
wholeDrawer.openDrawer(Gravity.START);
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
}