Autore Topic: EditText perde focus in ExpandableListView  (Letto 648 volte)

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
EditText perde focus in ExpandableListView
« il: 16 Gennaio 2013, 22:46:44 CET »
0
Ciao a tutti, ho letto diverse discussioni in merito ma non ho trovato nulla al caso mio. Nella mia Activity ho creato la mia expandableListView che popolo usando JSONObject. Quando apro la mia child list, visualizzo una lista di commenti che gli utenti possono lasciare. La mia child list può avere 0 commenti ma sicuramente ha come ultimo figlio un'EditText. Questa EditText mi permette di inserire commenti, che verranno aggiunti nella lista. Ora tutto funziona bene a parte una cosa:

-nel mio adapter, ogni volta che creo la mia EditText, chiamo su di essa il metodo requestFocus().
Questo perché vorrei che la mia EditText avesse il focus quando apro la lista dei commenti. Facendo questo, quando ci clicco sopra, o succede che la tastiera non si apre al primo click oppure si apre ma è lentissima.
Se invece non chiamo il metodo requestFocus() sulla mia EditText, quando apro la mia lista dei commenti e ci clicci sopra, la tastiera si apre + velocemente (ma non abbastanza) e dopo pochissimo la mia EditText perde il focus, quindi se digito non scrivo niente. Per scrivere qualcosa devo cliccare nuovamente sulla mia EditText.

questo è il codice del layout della mia EditText:

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_height="wrap_content"
  android:layout_width="fill_parent"
  android:orientation="vertical"
  android:paddingLeft="10dip"
  android:paddingRight="10dip"
  android:background="@color/lgray">
<RelativeLayout android:id="@+id/feedcell_addcomment" android:paddingLeft="10dip" android:paddingRight="10dip" android:paddingTop="5dip" android:paddingBottom="5dip" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="0.5dip" android:background="@color/mlgray" >
                 <EditText android:id="@+id/feedcell_edittxt" android:textColor="@color/black" android:layout_width="fill_parent" android:hint="Write a comment.." android:layout_height="35dip" android:textSize="14sp" android:gravity="center_vertical" android:paddingLeft="10dip" android:background="@drawable/bgfriendsedtxt" android:singleLine="true" android:focusableInTouchMode="true" android:focusable="true"/>
                 <Button android:id="@+id/feedcell_commentbtn" android:textColor="@color/black" android:textSize="14sp" android:layout_height="32dip" android:layout_width="60dip" android:text="Done"  android:layout_alignParentRight="true" android:layout_marginTop="4dip" android:layout_marginRight="5dip" android:gravity="center" android:focusable="false"/>
</RelativeLayout>
</LinearLayout>

Questo è il layout di ogni commento:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/layoutchildren"
  android:layout_height="wrap_content"
  android:layout_width="fill_parent"
  android:orientation="vertical"
  android:paddingLeft="10dip"
  android:paddingRight="10dip"
  android:background="@color/lgray">
    <RelativeLayout  android:paddingLeft="10dip" android:paddingRight="10dip" android:background="@color/white" android:layout_height="45dip" android:layout_width="fill_parent" android:layout_marginBottom="2dip" >
        <ImageView android:id="@+id/feedcommentcell_profileimg" android:layout_width="32dip" android:layout_height="32dip" android:layout_centerVertical="true" android:scaleType="fitXY"/>
        <TextView android:id="@+id/feedcommentcell_username" android:textStyle="bold" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="13sp" android:textColor="@color/black" android:layout_toRightOf="@+id/feedcommentcell_profileimg" android:layout_marginLeft="10dip" android:layout_alignTop="@+id/feedcommentcell_profileimg"/>
        <TextView android:id="@+id/feedcommentcell_comment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="11sp" android:textColor="@color/black" android:layout_toRightOf="@+id/feedcommentcell_profileimg" android:layout_marginLeft="10dip" android:layout_below="@+id/feedcommentcell_username"/>
        <TextView android:id="@+id/feedcommentcell_scanhour" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="10sp" android:textColor="@color/dgray" android:layout_alignParentRight="true" android:layout_alignBottom="@+id/feedcommentcell_username"/>
                </RelativeLayout>
</LinearLayout>

Questo è il codice del mio adapter:
   
Codice (Java): [Seleziona]
private class commentListAdapter extends BaseExpandableListAdapter
        {
                private static final int TYPE_EDIT = 1;
                private static final int TYPE_CHILD = 0;
                private ArrayList<JSONObject> itemsGroup;
                private HashMap<Integer,ArrayList<JSONObject>> itemsChildren;
                private Activity context;
                private ImgLoader imageLoader;
                private ImgLoader imageLoaderComment;
               
               
                public commentListAdapter(Activity context, ArrayList<JSONObject> itemsGroup , HashMap<Integer,ArrayList<JSONObject>> itemsChildren)
                {
                        super();
                        this.itemsGroup=itemsGroup;
                        this.itemsChildren=itemsChildren;
                        this.context=context;
                        imageLoader=new ImgLoader(getApplicationContext());
                        imageLoaderComment=new ImgLoader(getApplicationContext());
                       
                }
       
               
                @Override
                 public JSONObject getChild(int groupPosition, int childPosition) {
                        return itemsChildren.get(groupPosition).get(childPosition);
                    }

                @Override
                public long getChildId(int groupPosition, int childPosition) {
                        return childPosition;
                    }
               
            @Override
            public boolean areAllItemsEnabled()
            {
                return true;
            }
            @Override
            public int getChildrenCount(int groupPosition) {
                return itemsChildren.get(groupPosition).size();
               
            }

            @Override
            public JSONObject getGroup(int groupPosition) {
                return itemsGroup.get(groupPosition);
            }

            @Override
            public int getGroupCount() {
                return itemsGroup.size();
            }

            @Override
            public long getGroupId(int groupPosition) {
                return groupPosition;
            }
            @Override
            public boolean hasStableIds() {
                return false;
            }
         
            @Override
            public boolean isChildSelectable(int arg0, int arg1) {
                return true;
            }
       
            @Override
            public int getChildTypeCount ()
            {
                return 2;
            }
           
           
            @Override
            public int getChildType(int groupPosition,int childPosition)
            {
                int result = 0;
                if (childPosition == getChildrenCount(groupPosition) - 1)
                        result = 1;
                return result;
            }
           
            public String getSnapFromAdp2(int groupPos)
                {
                        JSONObject jo = itemsGroup.get(groupPos);
                        String result="";
                        try
                        {
                                JSONObject joSnap=new JSONObject();


                                joSnap=jo.getJSONObject("snapshot");
                                result=joSnap.getString("SnapshotId");
                        }
                        catch(Exception e){}
                        return result;
                }
           
            @Override
            public View getGroupView(int groupPosition, boolean isExpanded, View convertView,ViewGroup parent)
            {

                View v=convertView;
                if (v==null) {
                    LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi.inflate(R.layout.feedcell, null);
                }
                try
                {
                        JSONObject o = getGroup(groupPosition);
                       
                        if(o!=null)
                               
                        {
                                       
                                       
                                        TextView un =(TextView)v.findViewById(R.id.feedcell_username);
                                        un.setText(o.getString("username"));
                                       
                                        TextView sd =(TextView)v.findViewById(R.id.feedcell_scantime);
                                                sd.setText(o.getString("ShareTime"));
                                                 
                                ImageView feedcell_rescanimg1=(ImageView) v.findViewById(R.id.feedcell_rescanimg1);
                               
                                TextView favoriteNum=(TextView)v.findViewById(R.id.feedcell_favorite);
                                favoriteNum.setText(o.getString("favorites"));
                               
                                TextView commentsNum = (TextView)v.findViewById(R.id.feedcell_commentnum);
                                String messages=o.getString("messages");
                                commentsNum.setText(messages);
                               
                                final int mess=Integer.valueOf(messages);
                             
                               
                                                Button rescanbtn=(Button)v.findViewById(R.id.feedcell_rescan);
                                                final int idx=groupPosition;
                                       
                                               
                                                boolean isscanned=o.getInt("scanned")==1?true:false;
                                                if(isscanned)
                                                {
                                                        feedcell_rescanimg1.setVisibility(View.INVISIBLE);
                                                        rescanbtn.setVisibility(View.GONE);
                                                       
                                                } else
                                                {
                                                        feedcell_rescanimg1.setVisibility(View.VISIBLE);
                                                        rescanbtn.setVisibility(View.VISIBLE);
                                                        rescanbtn.setOnClickListener(new OnClickListener(){
                                                                @Override
                                                                public void onClick(View v) {
                                                                        rescan(idx);
                                                                }});
                                                }
                                               
                                       
                                       
                       
                                        TextView groupCount =(TextView)v.findViewById(R.id.feedcell_count);
                                        groupCount.setText(String.format("%,d", o.getInt("rescanned")));
                                       
                                        TextView groupFavoriteNum=(TextView)v.findViewById(R.id.feedcell_favorite);
                                        groupFavoriteNum.setText(o.getString("favorites"));
                                       
                                        TextView groupCommentsNum = (TextView)v.findViewById(R.id.feedcell_commentnum);
                                groupCommentsNum.setText(o.getString("messages"));
                               
                                 ImageView userimg = (ImageView) v.findViewById(R.id.feedcell_userimg);
                                userimg.setImageResource(R.drawable.stub);
                                               
                                ImageView tt = (ImageView) v.findViewById(R.id.feedcell_snapimg);
                                                tt.setImageResource(R.drawable.feednoimage);
                                               
                            String imgurl=o.getString("image");
                                                if(imgurl!=null && imgurl!="")
                                                        imageLoader.DisplayImage(imgurl, context, userimg);
                                               
                                                final String t_userid=o.getString("UserId");
                            userimg.setOnClickListener(new OnClickListener(){
                                                        @Override
                                                        public void onClick(View v) {
                                                                openProfile(t_userid);
                                                        }});
                           
                           
                           JSONObject snapshot=o.getJSONObject("snapshot");
                                               
                           
                               
                                                String URL = snapshot.getString("Image");
                                                if(URL!=null && URL.length()>5)
                                                {
                                                        imageLoader.DisplayImage(URL, context, tt);
                                                }
                                               
                                                ImageView feedcell_featured=(ImageView) v.findViewById(R.id.feedcell_featured);
                                   
                                                        if(snapshot.getInt("Featured")==0)
                                        feedcell_featured.setVisibility(View.INVISIBLE);
                                    else
                                        feedcell_featured.setVisibility(View.VISIBLE);
                                   
                                    TextView st =(TextView)v.findViewById(R.id.feedcell_title);
                                                        final String m_title=snapshot.getString("Title");
                                                        st.setText(m_title);
                                                        final String m_url=snapshot.getString("Link");
                                                        TextView sl =(TextView)v.findViewById(R.id.feedcell_link);
                                                        sl.setText(m_url);
                                                       
                                                       
                                                        TextView sdesc =(TextView)v.findViewById(R.id.feedcell_desc);
                                                        sdesc.setText(snapshot.getString("Description"));
                                                        sdesc.setOnClickListener(new OnClickListener(){
                                                                @Override
                                                                public void onClick(View v) {
                                                                        openWebView(m_url,m_title);
                                                                       
                                                                }});
                                                       
                                                        final String snapId=snapshot.getString("SnapshotId");
                                                        final boolean isExp=isExpanded;

                                                        scanCommFav=(RelativeLayout)v.findViewById(R.id.feedcell_scancommentfavorite);
                                                       
                                                        scanCommFav.setOnClickListener(new OnClickListener(){
                                                               
                                                                @Override
                                                                public void onClick(View v)
                                                                {
                                                                       
                                                                        if(!isExp)
                                                                        {
                                                                                if(mess==0)
                                                                                {
                                                                                        setIdx(idx);
                                                                                        addIndex(idx);
                                                                                        getCommentNoList();
                                                                               
                                                                                }
                                                                                else
                                                                                {
                                                                                        setIdx(idx);
                                                                                        addIndex(idx);
                                                                                        callCommentScript(snapId);

                                                                                }
                                                                               
                                                                        }
                                                                        else if(isExp)
                                                                        {
                                                                                setIdx(idx);
                                                                                removeIndex(idx);
                                                                                closeGroup(idx);

                                                                               
                                                                        }
                                                                       
                                               

                                                                }
                                                               
                                                        });
                                                       
                                                        ImageButton favoriteStar=(ImageButton)v.findViewById(R.id.feedcell_favoritestar);
                                               
                                                        favoriteStar.setOnClickListener(new OnClickListener(){
                                                               
                                                                @Override
                                                                public void onClick(View v)
                                                                {
                                                                        callFavoriteScript(snapId);
                                                                        idFav=idx;
                                                               
                                                                }
                                                               
                                                        });

                                                       

                                                       
                        }      
                }
                        catch(Exception e)
                        {}
               
                return v;
            }
           
           
            @Override
            public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)
            {
               
               
                View v = convertView;
                int type=getChildType(groupPosition,childPosition);
            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                if (v == null)
                {
                    switch(type)
                {
                       
                        case TYPE_EDIT:
                       
                                v = vi.inflate(R.layout.edittextcommentlist,null);
                                break;
                       
                       
                        case TYPE_CHILD:
               
                                v = vi.inflate(R.layout.feedcommentcell,null);
                                break;
                       
                }
         
                }  
                try
                {
                        if(type == TYPE_CHILD)
                        {
                                final JSONObject o = getChild(groupPosition,childPosition);
                               
                                if(o!=null)
                                {
                                       
                                        TextView commentUser=(TextView)v.findViewById(R.id.feedcommentcell_username);
                                        commentUser.setText(o.getString("username"));
                                       
                                        TextView commentText=(TextView)v.findViewById(R.id.feedcommentcell_comment);
                                        commentText.setText(o.getString("Message"));
                                       
                                        TextView commentScanHour=(TextView)v.findViewById(R.id.feedcommentcell_scanhour);
                                        commentScanHour.setText(o.getString("timestamp"));
                                       
                                        ImageView commentImg=(ImageView)v.findViewById(R.id.feedcommentcell_profileimg);
                                        String imgurl=o.getString("userimage");
                                       
                                       
                                        String snapId=o.getString("SnapshotId");
                                        setSnapshotId(snapId);
                                       
                                       
                                        if(imgurl!=null && imgurl!="")
                                                imageLoaderComment.DisplayImage(imgurl, context, commentImg);

                       
                                }
                               
                        }
                        else if(type==TYPE_EDIT)
                        {
                                JSONObject o = getChild(groupPosition,childPosition);
                                if(o!=null)
                                {
                               
                                        final int groupPos=groupPosition;
                                               
                                                addComment = (EditText)v.findViewById(R.id.feedcell_edittxt);
                                                //addComment.requestFocus();
                                       
                                                addComment.setOnClickListener(new OnClickListener(){
                                                       
                                                                @Override
                                                                public void onClick(View v)
                                                                {
                                                                        addComment.setText("");
                                                                       
                                                                }
                                                });

                                               
                                                addComment.setOnKeyListener(new OnKeyListener() {
                                                    public boolean onKey(View v, int keyCode, KeyEvent event) {
                                                           
                                                         
                                                         if((event.getAction() == KeyEvent.ACTION_UP) && (keyCode == KeyEvent.KEYCODE_ENTER ))
                                                         {
                                                                 String SnapId=getSnapshotId();
                                                               
                                                                                if(itemsChildren.get(groupPos).size()>1)
                                                                                {
                                                                                         if(getEditContent()>=1)
                                                                                         {
                                                                                               
                                                                                                getCommentAndAdd(SnapId,groupPos);
                                                                                            hideKeyboard();
                                                                                           
                                                                                         }
                                                                                         else
                                                                                         
                                                                                                 hideKeyboard();
                                                                                       
                                                                                }
                                                            else if(itemsChildren.get(groupPos).size()==1)
                                                                {
                                                                if(getEditContent()>=1)
                                                                {
                                                                       
                                                                        String groupSnap= getSnapFromAdp2(groupPos);
                                                                        getCommentAndAdd(groupSnap,groupPos);
                                                                                            hideKeyboard();

                                                                }
                                                                else
                                                               
                                                                        hideKeyboard();
                                                                                }

                                                         }
                                                   
                                                 
                                                         return false;
                                                    }
                                                    });
                                               
                                       
                                               
                                                commentBtn=(Button)v.findViewById(R.id.feedcell_commentbtn);
                                                commentBtn.setOnClickListener(new OnClickListener(){

                                                                @Override
                                                                public void onClick(View v) {
                                                                       
                                                                        String SnapId=getSnapshotId();
                                                       
                                                                        if(itemsChildren.get(groupPos).size()>1)
                                                                        {
                                                                                   
                                                                                   if(getEditContent()>=1)
                                                                                   {
                                                                                           getCommentAndAdd(SnapId,groupPos);
                                                                                           hideKeyboard();

                                                                                   }
                                                                                   else
                                                                                           hideKeyboard();
                                                                           
                                                                        }
                                                    else if(itemsChildren.get(groupPos).size()==1)
                                                        {
                                                         if(getEditContent()>=1)
                                                         {
                                                                 String groupSnap= getSnapFromAdp2(groupPos);
                                                                 getCommentAndAdd(groupSnap,groupPos);
                                                                 hideKeyboard();

                                                         }
                                                         else
                                                                 hideKeyboard();

                                                        }

                                                                       
                                                                }
                                                       
                                                });

                                }
             
                        }
               
                }
                catch(Exception e)
                {}
                return v;
            }
           
           
        }

Ho provato ad usare tutte le combinazioni possibili di android:focusable e android:focusableInTouchMode nei file Xml, ho provato a settare la disccendenza del focus nella mia expandableListView ma niente..
qualcuno ha una vaga idea di come io possa fare? Grazie

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:EditText perde focus in ExpandableListView
« Risposta #1 il: 17 Gennaio 2013, 12:28:35 CET »
0
Io ho avuto un po' di problemi mettendo degli EditText in una ListView... magari il problema è analogo.

Ho "risolto" in questo modo:
  • Settando android:descendantFocusability="beforeDescendants" come attributo della ListView in questione
  • Settando nel manifest android:windowSoftInputMode="adjustPan" all'activity che contiene la ListView

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:EditText perde focus in ExpandableListView
« Risposta #2 il: 17 Gennaio 2013, 17:11:44 CET »
0
Ciao Riky, innanzitutto grazie per la risposta. Ho già provato a fare quello che mi hai suggerito ed il risultato è che la tastiera si apre normalmente, e dopo un secondo perde il focus. Infatti il pulsante Done diventa dopo 1 secondo il pulsante di ritorno a capo. Il problema potrebbe essere risolto + o - con l'avvio di un thread o di un timer che rimette il focus sull'EditText dopo un secondo e mezzo ma i problemi poi sarebbero 2:
1) si vedrebbe il cambio di pulsante da Done - torna a capo -Done
2)non ho la certezza che il focus viene perso dopo 1 secondo e mezzo. Se in alcuni casi dovesse perderlo dopo, il thread non servirebbe a nulla.

Ci vorrebbe qualcosa per non far perdere il focus alla tastiera una volta aperta...

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:EditText perde focus in ExpandableListView
« Risposta #3 il: 25 Gennaio 2013, 03:35:40 CET »
0
Ho scoperto proprio ieri che questo problema si presenta sul telefono Samsung GalaxyS mentre è inesistente sul Sony XPERIA.
Indicativo di qualcosa?
Grazie