2016-01-11 3 views
0

Я пытаюсь создать простую систему обмена сообщениями в своем приложении. Пользователь вводит сообщение в EditText в нижней части экрана. Так или иначе, EditText, который отображается на экране, на самом деле не тот, который я получаю, используя findViewById().EditText editable, но getText() возвращает пустую строку

Я попытался добавить значение по умолчанию в EditText в xml и он работает. Но если я изменил текст по умолчанию, текст на экране изменится, но editText.getText() все еще возвращает значение по умолчанию. editText.setText() не меняет текст, отображаемый на экране, но меняет фактическое значение (editText.getText() возвращает новый текст).

Вот мой код:

fragment_message.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    tools:context="com.gloriovin.helpio.Views.MessageFragment" 
    android:id="@+id/message_fragment" 
    android:orientation="vertical"> 

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/sendMessageSection" 
     android:id="@+id/listView" 
     android:clipToPadding="false" 
     android:divider="@color/Transparent" 
     android:stackFromBottom="true" 
     android:transcriptMode="alwaysScroll"></ListView> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="45dp" 
     android:id="@+id/sendMessageSection" 
     android:layout_alignParentBottom="true" 
     android:background="@color/LightGrey"> 

     <com.mikepenz.iconics.view.IconicsImageView 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:id="@+id/sendButton" 
      android:layout_alignParentRight="true" 
      android:layout_centerVertical="true" 
      android:layout_marginRight="3dp" 
      app:iiv_size="25dp" 
      app:iiv_color="@color/DarkGrey" 
      app:iiv_icon="gmd-send" /> 

     <EditText 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:id="@+id/messageField" 
      android:layout_toLeftOf="@id/sendButton" 
      android:singleLine="true" 
      android:text="kuda" 
      android:layout_marginLeft="10dp" 
      android:layout_marginRight="3dp" 
      android:gravity="bottom"/> 

    </RelativeLayout> 

</RelativeLayout> 

chatActivity.java

import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 

import com.gloriovin.helpio.R; 

public class ChatActivity extends AppCompatActivity { 

    private Toolbar toolbar; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_chat); 
     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     toolbar.setTitle("Message"); 

     MessageFragment messageFragment = new MessageFragment(); 
    getSupportFragmentManager().beginTransaction().replace(R.id.fragment, messageFragment). commit(); 

    } 

    @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_message, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

} 

messageFragment.java

import android.app.Activity; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.design.widget.FloatingActionButton; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.EditText; 
import android.widget.ListView; 

import com.gloriovin.helpio.Adapters.friendAdapters; 
import com.gloriovin.helpio.Adapters.messageAdapters; 
import com.gloriovin.helpio.Globals; 
import com.gloriovin.helpio.HelpioApp; 
import com.gloriovin.helpio.Models.Message; 
import com.gloriovin.helpio.Models.MessageRoom; 
import com.gloriovin.helpio.R; 
import com.mikepenz.iconics.view.IconicsImageView; 

import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.ArrayList; 
import java.util.zip.Inflater; 

import cz.msebera.android.httpclient.Header; 
import io.paperdb.Paper; 


public class MessageFragment extends Fragment { 
    private Activity activity; 
    private int mid; 
    public MessageFragment() { 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_message, container, false); 

    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mid = getActivity().getIntent().getIntExtra("mid", -1); 
     this.activity = getActivity(); 
     Log.e("mid", String.valueOf(mid)); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 



     ListView listView = (ListView) getActivity().findViewById(R.id.listView); 
     messageAdapters adapter = new messageAdapters(getActivity(), FAKECHAT); 
     listView.setDivider(null); 
     listView.setAdapter(adapter); 


     IconicsImageView sendButton = (IconicsImageView) getActivity().findViewById(R.id. sendButton); 
     sendButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       EditText newMessage = (EditText) getActivity().findViewById(R.id.messageField); 
       String msg = newMessage.getText().toString(); 
       Log.e("message is", "asd"+msg); 
      } 
     }); 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
    } 
} 

TLDR: в messageFragment.java, значение EditText (.getText()) отличается (пустая строка "), чем то, что на самом деле было введено в EditText. setText() не меняет внешний вид EditText но изменить результат getText()

+0

Определение EditText перед тем sendButton.setOnClickListener() и проверить – Yatish

ответ

1

здесь:

EditText newMessage = (EditText) getActivity().findViewById(R.id.messageField); 

Возможно получая NPE Exception потому что newMessage является null.

EditText с messageField внутри fragment_message расположение, которое представляет собой фрагмент фрагмента. поэтому используйте метод getView для инициализации объекта newMessage вместо getActivity(), которые возвращают контекст активности, в котором доступен фрагмент.

переопределение onViewCreated и инициализировать все виды с помощью v.findViewById:

ListView listView; 
IconicsImageView sendButton; 
EditText newMessage; 
public void onViewCreated(View v, Bundle savedInstanceState) { 
    super.onViewCreated(v, savedInstanceState); 
    listView = (ListView) v.findViewById(R.id.listView); 
    sendButton = (IconicsImageView) v.findViewById(R.id. sendButton); 
    newMessage = (EditText) v.findViewById(R.id.messageField); 
} 
+0

Это решает эту проблему! Большое спасибо! Я пробовал что-то очень похожее на решение Кешава, но оно не работало. –

+0

Я просто заметил, что это вызывает еще одну проблему. Кажется, есть два EditText в моем фрагменте, хотя у меня есть только один в XML. Когда действие начинается, EditText получает фокус, и я могу ввести без каких-либо изменений внешнего вида и нажать кнопку отправки и отправить сообщение на самом деле. Вы случайно не знаете, что может это сделать? Спасибо –

0

Запись этой линии, за пределами вашего щелчка слушателя

EditText newMessage = (EditText) getActivity().findViewById(R.id.messageField); 
+0

Я пробовал и не повезло с этим до –

+0

Это сработало для u ?? –

+0

Это не работает для меня.У ρяσѕρєя есть объяснение, почему использование getActivity() для получения EditText не работает –

0

Вы не Fetching EditText правильно.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    mView = inflater.inflate(R.layout.fragment_message, container, false); 
    newMessage = (EditText) mView.findViewById(R.id.messageField); 

    String msg = newMessage.getText().toString(); 
    return mView; 
} 
+0

Я пробовал что-то очень похожее на ваше решение, но он не работал. Решение pяσѕρєя прекрасно работает. Спасибо в любом случае –

+0

Отметьте свой ответ как правильный – Keshav

Смежные вопросы