Данные из класса исключению в фрагмент?

Интерфейс, диалоги, темы, стили, меню
lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Данные из класса исключению в фрагмент?

Сообщение lamberto » 07 апр 2015, 12:44

Стоит вопрос, передать данные с класса исключения где я принимаю SMS и хочу после некоторых операций над тестом передать в один из фрагментов в TextView?

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: Данные из класса исключению в фрагмент?

Сообщение lamberto » 07 апр 2015, 15:00

Делаю так:

Fragment4 yfc = new Fragment4();
Bundle bundle1 = new Bundle();
bundle1.putString("tag", result1);
yfc.setArguments(bundle1);
Log.d(LOG_TAG,"Содержимое "+ bundle1 + "Результат" + result1);
Это в классе где перехватываю входящее SMS

В bundle1 сожержимое tag значение string приходит!

И уже непосредственно в фрагменте ловлю:

txtsetgd.setText(getArguments().getString("tag"));

Ну нет там ничего к сожалению......
В чем же может быть проблемка???

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Данные из класса исключению в фрагмент?

Сообщение doter.ua » 07 апр 2015, 16:00

Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: Данные из класса исключению в фрагмент?

Сообщение lamberto » 07 апр 2015, 16:06

Пока непонятно, прокоментируйте пожалуйста!?
Не могу понять причем тут фрагмент манаджер, я же не с фрагмента данные передавать хочу, у меня этот класс с которого передаю тупо для исключения создать принимать входящий смс.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Данные из класса исключению в фрагмент?

Сообщение doter.ua » 07 апр 2015, 16:59

lamberto писал(а):Пока непонятно, прокоментируйте пожалуйста!?
Не могу понять причем тут фрагмент манаджер, я же не с фрагмента данные передавать хочу, у меня этот класс с которого передаю тупо для исключения создать принимать входящий смс.
А где создаете экземпляр вашего вспомогательного класса? возвращать return-м можете?
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: Данные из класса исключению в фрагмент?

Сообщение lamberto » 07 апр 2015, 20:01

Даю более подробную картину...

Класс для приёма SMS сообщений и дальнейшая обработка.

Код: Выделить всё

public class IncomingSms extends BroadcastReceiver {


    final SmsManager sms = SmsManager.getDefault();
    EditText etName;
    final String LOG_TAG = "myLogs";
    Context context;
    DBHelper dbHelper;
    SQLiteDatabase db;
    Cursor c;
    String result1;
    String result2;
    String result3;
    CharSequence Masktemp1 = "WEx0";
    CharSequence Masktemp2 = "WEx1";
    CharSequence Maskbalance = "Balance:";
    FragmentManager fm;

    SimpleDateFormat sdf = new SimpleDateFormat("dd.MM HH:mm ");
    Date currentDate = new Date();


    public void onReceive(Context context, Intent intent) {


        final Bundle bundle = intent.getExtras();
        try {

            if (bundle != null) {

                final Object[] pdusObj = (Object[]) bundle.get("pdus");

                for (int i = 0; i < pdusObj.length; i++) {

                    SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                    String phoneNumber = "5556";

                    String senderNum = phoneNumber;
                    String message = currentMessage.getDisplayMessageBody();
                    Log.i("SmsReceiver", "Номер отправителя: " + senderNum + "; Cooбщение: " + message);
                    // Show alert
                    int duration = Toast.LENGTH_LONG;
                    Toast toast = Toast.makeText(context, "Номер отправителя: " + senderNum + ", Cooбщение: " + message, duration);
                    toast.show();


                    // Создание базы данных!
                    dbHelper = new DBHelper(context);
                    ContentValues cv = new ContentValues();

                    db = dbHelper.getWritableDatabase();
                    cv.put("sms", sdf.format(currentDate) + message);
                    c = db.query("mytable", null, null, null, null, null, null);
                    long rowID = db.insert("mytable", null, cv);
                    Log.d(LOG_TAG, "row inserted, ID = " + rowID + " Текст: " + sdf.format(currentDate) + message);
                    c.requery();
                    dbHelper.close();

                    if (message.contains(Masktemp1) == true) {

                        result1 = message.substring(21, 28);

                        Fragment4 yfc = new Fragment4();
                        Bundle bundle1 = new Bundle();
                        bundle1.putString("tag", result1);
                        Log.d(LOG_TAG,"Содержимое "+ bundle1 + "Результат" + result1);
                        yfc.getFragmentManager().findFragmentByTag("tag");
                        yfc.setArguments(bundle1);
                    }

                     else if (message.contains(Masktemp2))

                        result2 = message.substring(22, 29);

                    else if (message.contains(Maskbalance))

                        result3 = message.substring(9, 20);


                }// end for loop
            } // bundle is null

        } catch (Exception e) {
            Log.e("SmsReceiver", "Exception smsReceiver" + e);

        }


    }

}



Класс Фрагмента в который необходимо передать данные

Код: Выделить всё

public class Fragment4 extends Fragment {

    static final String ARGUMENT_PAGE_NUMBER = "arg_page_number";

    int pageNumber;
    String stat;


    static Fragment4 newInstance(int page) {
        Fragment4 pageFragment = new Fragment4();
        Bundle arguments = new Bundle();
        arguments.putInt(ARGUMENT_PAGE_NUMBER, page);
        pageFragment.setArguments(arguments);
        return pageFragment;


    }

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

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

        Bundle bundle = getArguments();
        if (bundle != null) {
            stat = bundle.getString("tag");
        }


        View view = inflater.inflate(R.layout.fragment4, container, false);
        Button  btnzb = (Button) view.findViewById(R.id.button9);
        Button  btnztod = (Button) view.findViewById(R.id.button11);
        Button  btnztgd = (Button) view.findViewById(R.id.button10);
        TextView  txtzagb = (TextView) view.findViewById(R.id.zprb);
        TextView  txtzagt = (TextView) view.findViewById(R.id.zprt);
        TextView  txtsetb = (TextView) view.findViewById(R.id.setb);
        TextView txtsetgd = (TextView) view.findViewById(R.id.setgd);
        TextView   txtsetod = (TextView) view.findViewById(R.id.setod);
        txtsetgd.setText(stat);
        Toast.makeText(getActivity(), stat, Toast.LENGTH_SHORT).show();



        return view;
    }
}
В лог в классе bundle заполняется, но до фрагмента не доходит...

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: Данные из класса исключению в фрагмент?

Сообщение lamberto » 07 апр 2015, 23:36

ПРобую так
Fragment4 yfc = new Fragment4();
// yfc = (Fragment4) fm.findFragmentByTag(TAG_1);
Bundle bundle1 = new Bundle();
bundle1.putString("tag", result1);
Log.d(LOG_TAG,"Содержимое "+ bundle1 + "Результат " + result1);
yfc.setArguments(bundle1);

// yfc.getFragmentManager();
fm.beginTransaction().replace(R.id.sample_content_fragment, yfc).commit();

НО выскакивает Exception smsReceiverjava.lang.NullPointerException

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: Данные из класса исключению в фрагмент?

Сообщение lamberto » 08 апр 2015, 03:22

И вновь пробую уже так....

Fragment4 yfc = new Fragment4();
// yfc = (Fragment4) fm.findFragmentByTag(TAG_1);
Bundle bundle1 = new Bundle();
bundle1.putString("tag", result1);
Log.d(LOG_TAG,"Содержимое "+ bundle1 + "Результат " + result1);
yfc.setArguments(bundle1);
FragmentManager fragmentManager = yfc.getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.RelativeLayout4, yfc).commit();

до сих пор выскакивает NullPointerException что делать мне Help me pls!

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Данные из класса исключению в фрагмент?

Сообщение Foenix » 08 апр 2015, 10:39

по ссылке в подписи
и научись, наконец, код оформлять. Выбирай в редакторе java-5
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: Данные из класса исключению в фрагмент?

Сообщение lamberto » 08 апр 2015, 12:33

Хорошо логи то посмотрю... обязательно, но ошибка явная т.к. в bundle result1 приходит это видно по логу...
а вот далее либо не могу взять манаджер у фрагмента либо проблема в тразакции и здесь скорее всего фрагмент не пересоздается т.к. не видит id , если я правильно понимаю то id я указываю контейнера layoutа фрагмента в моем случаю это RelativeLayour4..?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Данные из класса исключению в фрагмент?

Сообщение doter.ua » 08 апр 2015, 16:50

lamberto писал(а):Хорошо логи то посмотрю... обязательно, но ошибка явная т.к. в bundle result1 приходит это видно по логу...
а вот далее либо не могу взять манаджер у фрагмента либо проблема в тразакции и здесь скорее всего фрагмент не пересоздается т.к. не видит id , если я правильно понимаю то id я указываю контейнера layoutа фрагмента в моем случаю это RelativeLayour4..?
отсылай интентом в активити, а оттуда в фрагмент.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: Данные из класса исключению в фрагмент?

Сообщение lamberto » 09 апр 2015, 12:21

Не пойму как это сделать....
такой конструктор как обычно его рисует Intent sendler = new Intent(context1, MainActivity.class);
sendler.putExtra("FILES_LIST", result1);
context1.startActivity(sendler);
не помогает.

Может пробовать BroadcastReciver использовать?

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: Данные из класса исключению в фрагмент?

Сообщение lamberto » 09 апр 2015, 16:20

Тут у меня появился ещё один вопрос т.к. c Активити я могу конечно слать в фрагмент, но т.к.
в onCreate создаётся фрагмент для viewpager

Код: Выделить всё

[syntax=java5]@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        if (savedInstanceState == null) {
          
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            SlidingTabsColorsFragment fragment = new SlidingTabsColorsFragment();
          
            transaction.replace(R.id.sample_content_fragment, fragment); //sample_content_fragment
            transaction.commit();

      
        }

    }
[/syntax]
А все остальные фрагменты это классы которые получают position ... ну там понятно...

Тогда как мне обратится из Activity к моему 4 фрагменту думаю что как то через findFragmentByTag, но какой тогда будет Tag??? этого фрагмента, но опять же думаю что типо есть position и он может быть как то связан с Tag моего фрагмента??? короче совсем запутался.....
Выручайте пожалуйста!!! уже 3 день с этой задачей бьюсь.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Данные из класса исключению в фрагмент?

Сообщение doter.ua » 09 апр 2015, 17:24

В бродкастРесивере

Код: Выделить всё

        String value = "1232131";
        String key = "result_string";
        Intent intent = new Intent(getApplicationContext(), MyFragmentActivity.class);
        intent.putExtra( key, value );
        startActivity(intent);
В активити в онкреэйт:

Код: Выделить всё

        String key = "result_string";
        String value = "default value";
        if( getIntent() != null ) {
            if( getIntent().getExtras() != null ) {
                value  =  getIntent().getExtras().getString(key, "default value");
            }
        }
ВьюПейджер? вот пример адаптера для него:

Код: Выделить всё

public class MyFragmentAdapter extends FragmentStatePagerAdapter {
    private ArrayList<Fragment> list;

    public MyFragmentAdapter(FragmentManager fm, ArrayList<Fragment> list ) {
        super(fm);
        this.list = list;
    }
    @Override
    public Fragment getItem(int position) {
        return list.get( position );
    }
    @Override
    public int getCount() {
        return list.size();
    }
}
Кусок активити:

Код: Выделить всё

public class MyFragmentActivity extends FragmentActivity implements ViewPager.OnPageChangeListener {
    private ViewPager mPager;
    private PagerAdapter mPagerAdapter;
    private ArrayList<Fragment> frList;
  


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

        mPager = (ViewPager) findViewById(R.id.viewPager);

        frList = new ArrayList<>();
        frList.add( new MyFragment1() );
        frList.add( new MyFragment2() );
        frList.add( new MyFragment3() );

        mPagerAdapter = new MyFragmentAdapter( getSupportFragmentManager(), frList );
        mPager.setAdapter(mPagerAdapter);
        
        ((MyFragment1) frList.get(0)).callSomePublicMethod( "some string" ); // публичный метод из фрагмента1
    }
//...
}
Где-то в фрагменте1:

Код: Выделить всё

    public void callSomePublicMethod(String str){
       //...
    }
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: Данные из класса исключению в фрагмент?

Сообщение lamberto » 09 апр 2015, 18:04

почему то метод getApplicationContext() не определяется ....
пайджер реализован уже давно) видимо сбил смысли, извиняюсь.

Код: Выделить всё

[syntax=java5] @Override
        public Fragment getItem(int position) {
            mTabsPosition = position;
            if (position == 1) {
                return Fragment2.newInstance(position);
            }
            else if (position == 2){
                return Fragment3.newInstance(position);
            }
               else if (position == 3){
                return Fragment4.newInstance(position);
            }
             else
                
                return Fragment1.newInstance(position);
        }
[/syntax]
..


Вот никак не пойму как с MainActivity передать данные в Fragment4 если тупо в активити указать фрагмент для контейнера дак и создастся только 1 фрагмент. но данные перекидывает... а как, теперь передать в нужный мне фрагмент не понимаю. Щас сдохну уже сутками сижу читаю уже голова вскипает...

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Данные из класса исключению в фрагмент?

Сообщение doter.ua » 09 апр 2015, 18:16

lamberto писал(а):почему то метод getApplicationContext() не определяется ....
пайджер реализован уже давно) видимо сбил смысли, извиняюсь.

Код: Выделить всё

[syntax=java5] @Override
        public Fragment getItem(int position) {
            mTabsPosition = position;
            if (position == 1) {
                return Fragment2.newInstance(position);
            }
            else if (position == 2){
                return Fragment3.newInstance(position);
            }
               else if (position == 3){
                return Fragment4.newInstance(position);
            }
             else
                
                return Fragment1.newInstance(position);
        }
[/syntax]
..


Вот никак не пойму как с MainActivity передать данные в Fragment4 если тупо в активити указать фрагмент для контейнера дак и создастся только 1 фрагмент. но данные перекидывает... а как, теперь передать в нужный мне фрагмент не понимаю. Щас сдохну уже сутками сижу читаю уже голова вскипает...
Я показывал как, 23 строчка предпоследний кусок с кодом
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: Данные из класса исключению в фрагмент?

Сообщение lamberto » 09 апр 2015, 18:58

1. Не понимаю для чего frList.get(0) если правильно понимаю то frList только для удобства потому как можно явно указать 4 фрагмент, апаблик метод только для того что бы взять стринг?
2. Куда делся replace замещение фрагмента у меня pager хранит странички а не пересоздает?

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: Данные из класса исключению в фрагмент?

Сообщение lamberto » 09 апр 2015, 20:28

Не катит так к сожалению.... огромная кучка NPE

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: Данные из класса исключению в фрагмент?

Сообщение lamberto » 09 апр 2015, 22:20

Короче говоря меня проблема уже за..бла............... кучу информации прочитал понял что это проблема, но решения я не нашел. Из всего понял что если фрагмент создаётся динамически, то findFragmentById работает исключительно с контейнером, как правило который содержится в layout в main и работает это если создан 1 фрагмент, а как только появляется FragmentPagerAdapter с замещением фрагмента начинается жопа.... Если кто знает решение проблемы передачи данных из MainActivity в Fragment прикрученный к FragmentPagerAdapter, очень прошу изложите как можно подробнее как все таки это сделать!!!

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: Данные из класса исключению в фрагмент?

Сообщение lamberto » 10 апр 2015, 11:01

Во, где то нарыл решение определить несколько паблик методов в супер классе FragmentPagerAdapter, которые при определённом position будут записывать TAG фрагменту через FragmеntManager, ну а далее можно будет из класса MainActiviy работать непосредственно с нашими фрагменами воспользовавшись методом findFragmentByTAG...

Ответить