2015-07-19 11 views
0

У меня есть приложение, которое имеет одно основное действие, которое, в свою очередь, содержит две вкладки. Каждая вкладка является фрагментом. Первая вкладка имеет editText, а кнопка и кнопка нажимают текст, введенный пользователем, должен отображаться на втором фрагменте вкладки, в котором размещается только один текстовый элемент. Я использую прослушиватель для передачи данных, но по какой-то причине приложение вылетает, когда я нажимаю кнопку отправки. Любая помощь будет оценена по достоинству. Вот мой код:Передача данных между двумя фрагментами вкладок в SlidingTabslayout

MainActivity.java

public class MainActivity extends AppCompatActivity implements OnEditTextListener { 

    Toolbar toolbar; 
    ViewPager pager; 
    ViewPagerAdapter adapter; 
    SlidingTabLayout tabs; 
    CharSequence Titles[] = {"Home", "Events"}; 
    int Numboftabs = 2; 

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

     // Creating The Toolbar and setting it as the Toolbar for the activity 

     toolbar = (Toolbar) findViewById(R.id.tool_bar); 
     setSupportActionBar(toolbar); 


     // Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs. 
     adapter = new ViewPagerAdapter(getSupportFragmentManager(), Titles, Numboftabs); 

     // Assigning ViewPager View and setting the adapter 
     pager = (ViewPager) findViewById(R.id.pager); 
     pager.setAdapter(adapter); 

     // Assiging the Sliding Tab Layout View 
     tabs = (SlidingTabLayout) findViewById(R.id.tabs); 
     tabs.setDistributeEvenly(true); // To make the Tabs Fixed set this true, This makes the tabs Space Evenly in Available width 

     // Setting Custom Color for the Scroll bar indicator of the Tab View 
     tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() { 
      @Override 
      public int getIndicatorColor(int position) { 
       return getResources().getColor(R.color.ColorPrimary); 
      } 
     }); 

     // Setting the ViewPager For the SlidingTabsLayout 
     tabs.setViewPager(pager); 
    } 

    @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) { 
     // 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); 
    } 

    @Override 
    public void OnEditText(String data) { 
     Tab2 newFragment = (Tab2)adapter.getItem(1); 
     newFragment.updateDisplay(data); 
    } 
} 

Tab1.java

import android.app.Activity; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.text.Editable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 

public class Tab1 extends Fragment 
{ 
    public interface OnEditTextListener { 
     public void OnEditText(String data); 
    } 

    OnEditTextListener editTextListener = null; 
    EditText edtText; 
    Button btnSubmit; 

    String val; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      editTextListener = (OnEditTextListener) activity; 
     } catch (ClassCastException ex) { 
      ex.printStackTrace(); 
     } 
    } 

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

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

     edtText = (EditText)getActivity().findViewById(R.id.edtText); 
     btnSubmit = (Button)getActivity().findViewById(R.id.btnSubmit); 
     btnSubmit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       val = edtText.getText().toString(); 
       editTextListener.OnEditText(val); 
      } 
     }); 
    } 
} 

Tab2.java

public class Tab2 extends Fragment { 

    public static final String TAG = "DATA"; 
    public static final String SAVE = "NBHJB"; 
    String newdata = ""; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     if (savedInstanceState != null) 
      savedInstanceState.getInt(SAVE); 

     return inflater.inflate(R.layout.second_fragment, container, false); 
    } 

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

     if (savedInstanceState != null) { 
      savedInstanceState.getString(SAVE); 
     } 
    } 

    public void updateDisplay(String data) { 
     newdata = data; 
     TextView randomData = (TextView) getActivity().findViewById(R.id.txtView1); 
     randomData.setText(newdata); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 

     outState.putString(SAVE, newdata); 
    } 

MainActivity.xml

<LinearLayout 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" 
    android:orientation="vertical" 
    tools:context=".MainActivity"> 

    <include 
     android:id="@+id/tool_bar" 
     layout="@layout/tool_bar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <View 
     android:layout_height="2dip" 
     android:background="@color/tabsScrollColor" 
     android:layout_width="wrap_content" /> 

    <com.example.regi.tabsprove.SlidingTabLayout 
     android:id="@+id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@color/prove" 
     android:elevation="2dp" /> 



    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="1"></android.support.v4.view.ViewPager> 


</LinearLayout> 

second_fragment.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/txtView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:gravity="center" 
     android:padding="10dp" 
     android:text="Default Text" 
     android:textSize="20dp" /> 

</LinearLayout> 

Это ошибка, я получаю

java.lang.NullPointerException 
      at com.example.regi.tabsprove.Tab2.updateDisplay(Tab2.java:36) 
      at com.example.regi.tabsprove.MainActivity.OnEditText(MainActivity.java:79) 
      at com.example.regi.tabsprove.Tab1$1.onClick(Tab1.java:51) 
      at android.view.View.performClick(View.java:4198) 
      at android.view.View$PerformClick.run(View.java:17158) 
      at android.os.Handler.handleCallback(Handler.java:615) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4918) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771) 
      at dalvik.system.NativeStart.main(Native Method) 
+0

Пожалуйста, выделите линию 36 в Tab 2! – ganeshvjy

+0

@GaneshThiagarajan С его помощью: 'TextView randomData = (TextView) getActivity(). FindViewById (R.id.txtView1); ' – DevilSummer

+0

Где вы называете эту функцию updateDisplay() ?? – ganeshvjy

ответ

1

Я уверен, что строка Tab2 newFragment = (Tab2)adapter.getItem(1); создает новый экземпляр Tab2 вместо того, чтобы предоставить вам фрагмент, который вам нужен. Вы должны найти лучший способ получить экземпляр фрагмента, который был создан для вас ViewPager; Я уверен, что этот post может вам помочь.

+0

Да, это была проблема. Благодарим за помощь – DevilSummer

+0

Очевидно, что getItem() вводит в заблуждение, и нам нужно получить экземпляр существующего фрагмента, который мы хотим, используя 'findFragmentByTag();' – DevilSummer

+0

@DevilSummer: мой опыт немного отличается от того, что вы определяете ' вводит в заблуждение. Предположим, у вас есть ViewPager с 5 фрагментами, и вам нужен способ связи между первым и последним фрагментами. Это невозможно в том, как вы реализуете эту функцию, потому что, когда вы находитесь в первом фрагменте, вы не знаете статус последнего. Вы даже не знаете, был ли этот Фрагмент построен или нет. Как насчет переключения вашего подхода к SharedPreferences? Сохраните значение в первом фрагменте, прочитайте значение со второго (вы также можете получать уведомления об изменениях предпочтений) –

0

Я нашел ваш дизайн немного сложнее, чем обычные передачи данных. Из журналов проблема заключается в том, что программа не может найти txtView1 во втором фрагменте. Всегда полезно использовать пакет для передачи данных.

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

Объявить свой TextView рядом с NewData

public static final String TAG = "DATA"; 
public static final String SAVE = "NBHJB"; 
String newdata = ""; 
TextView randomData; 

Инициализировать его в onCreateView()

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    if (savedInstanceState != null) 
     savedInstanceState.getInt(SAVE); 

    View rootView = inflater.inflate(R.layout.second_fragment, container, false); 

    randomData = (TextView) rootView.findViewById(R.id.txtView1); 

    return rootView; 
} 

Изменение функции updateDisplay

public void updateDisplay(String data) { 
    newdata = data; 
    randomData.setText(newdata); 
} 

Убедитесь, что вы не имеете любые другие вопросы, с тот же идентификатор, что и txtView1.

+0

Я осуществил изменения, рекомендованные и теперь я получаю эту ошибку ' 32403-32403/com.example.regi.tabsprove E/AndroidRuntime: НЕУСТРАНИМОЕ ИСКЛЮЧЕНИЕ: главный java.lang.NullPointerException в com.example.regi .tabsprove.Tab2.updateDisplay (Tab2.java:41) ' – DevilSummer

+0

Соответствует этой строке ' randomData.setText (newdata); ' – DevilSummer

+0

Что было бы лучшим способом передачи данных в этом случае (я следовал общему подходу передачи данных между 2 фрагментами с использованием интерфейса). Не могли бы вы предоставить мне пример или, пожалуйста? – DevilSummer

0

Вот решение для всех, кто может столкнуться тот же вопрос:

public static String makeFragmentName(int containerViewId, long id) { 
     return "android:switcher:" + containerViewId + ":" + id; 
    } 

    public @Nullable 
    Fragment getFragmentForPosition(int position) 
    { 
     String tag = makeFragmentName(pager.getId(), position); 
     Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag); 
     return fragment; 
    } 

    @Override 
    public void OnEditText(String data) { 
     Tab2 tab2 = (Tab2)getFragmentForPosition(1); 
     tab2.updateDisplay(data); 
    } 

Этот код идет в MainActivity.java

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