2015-09-10 3 views
1

Я много искал, как общаться между фрагментами, используя SlidingTabLayout, но на самом деле не получил хорошего ответа. (Хотя я все еще не знаком с андроидом), я не думаю, что я слишком далек от решения - любая помощь будет оценена по достоинству. В настоящее время я делаю проект шагомера, и я пытаюсь обновить TextView в SlidingTabLayout при обнаружении Step. У меня есть интерфейс StepListener, который уведомляется при обнаружении Step, думал, что мои вкладки могут просто реализовать интерфейс и получать уведомление, тем самым увеличивая мой TextView по мере того, как я ухожу, но не имею успеха.Передача события прослушивателя на SlidingTabLayout

Я пробовал this. Когда debuggin заметил, что он достигает метода StepChanged в Tab1, но затем приложение падает. Любая помощь приветствуется.

Мой MainActivity ....

public class PedometerActivity extends ActionBarActivity implements StepListener, ServiceConnection { 

    // applying buissness rules 
    public static final int DAILY_GOAL = 10000; 

    public float currentSteps; 


    // Declaring Your View and Variables for the UI 
    Toolbar toolbar; 
    ViewPager pager; 
    ViewPagerAdapter adapter; 
    SlidingTabLayout tabs; 
    CharSequence Titles[] = {"Home", "MyStats"}; 
    int Numboftabs = 2; 

    //declaring Variables for acess to Db and Prefs 
    UserLocalStore userLocalStore; 
    SharedPreferences sharedPreferences; 

    //declaring variables for the Step\Service 
    private StepService mStepService = null; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_pedometer); 
     userLocalStore = new UserLocalStore(this); 

     this.startStepService(); 
     this.bindStepService(); 

     /* sharedPreferences = getSharedPreferences("steps", Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putInt("currentSteps", numSteps); TODO remove this 
     editor.commit();*/ 

     // 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.tabsScrollColor); 
      } 
     }); 


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


    } 

    @Override 
    public void stepsChanged(float numSteps) { 


     //TODO ///// 

     for (int loop = 0; loop < adapter.getCount(); loop++) { 

      if (adapter.getItem(0) instanceof StepListener) { 
       ((StepListener) adapter.getItem(0)).stepsChanged(numSteps); 
      }//end of if 
     }// end of for loop 

    } 

    public float getCurrentSteps(float currentSteps) { 

     return currentSteps; 

    } 


    /** 
    * currently unused....code 
    * 
    * @return 
    */ 
    private boolean authenticate() { 
     return userLocalStore.getUserLoggedIn(); 
    } 

    @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 
    protected void onPostResume() { 
     super.onPostResume(); 
    } 

    private void startStepService() { 
     this.startService(new Intent(PedometerActivity.this, StepService.class)); 

    } 

    /** 
    * binds Pedometer Activity to the Service class 
    * (I.e this service is going to communicate to this Activity) 
    * must implement the ServiceConnection interface here 
    */ 
    private void bindStepService() { 
     this.bindService(new Intent(PedometerActivity.this, StepService.class), 
       this, Context.BIND_AUTO_CREATE + Context.BIND_DEBUG_UNBIND); 

    } 

    @Override 
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) { 

     mStepService = ((StepService.StepBinder) iBinder).getService(); 
     mStepService.registerStepListener(this); 

    } 

    @Override 
    public void onServiceDisconnected(ComponentName componentName) { 

    } 


} 

мой Tab1 ....

public class Tab1 extends Fragment implements StepListener { 

    private static final int DAILY_GOAL = 10000; 

    UserLocalStore userLocalStore; 

    TextView tvStepValue; 

    //float currentSteps; 

    Database db; 

    private Activity activity; 
    private PieChart mPieChart; 
    private PieModel sliceGoal, sliceCurrent; 

    StepCounter mStepCounter; 


    public Tab1() { 
     // Required empty public constructor 
    } 


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


     tvStepValue = (TextView) v.findViewById(R.id.tvStepValue); 


     // mPieChart = (PieChart) v.findViewById(R.id.piechart); 
     // load data to PieCHart 

     return v; 
    } 

    /** 
    * method needed in Order to give the fragment a context to be used in conjunction with SharedPref/Database 
    * 
    * @param activity 
    */ 
    @Override 
    public void onAttach(Activity activity) { 
     this.activity = activity; 
     super.onAttach(activity); 
    } 

    private void loadData(View v) { 


    } 


    @Override 
    public void stepsChanged(float numSteps) { 
     tvStepValue.setText(String.valueOf(numSteps)); 
    } 


} 

мое сообщение об ошибке, когда приложение падает ....

09-10 17:21:29.748 26336-26336/com.example.calum.myslidingtablayout E/AndroidRuntime﹕ FATAL EXCEPTION: main 
java.lang.NullPointerException 
     at com.example.calum.myslidingtablayout.Tab1.stepsChanged(Tab1.java:81) 
     at com.example.calum.myslidingtablayout.PedometerActivity.stepsChanged(PedometerActivity.java:100) 
     at com.example.calum.myslidingtablayout.StepCounter.onSensorChanged(StepCounter.java:50) 
     at android.hardware.SystemSensorManager$ListenerDelegate$1.handleMessage(SystemSensorManager.java:250) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4867) 
     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:1007) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
     at dalvik.system.NativeStart.main(Native Method) 

ответ

0

Связь между фрагментами проста, как только вы привыкли к ней. В Tab 1 вам необходимо настроить свой интерфейс и связать его с классом PedometerActivity. Google explains how to preform fragment communications via interface

Короче вы в конечном итоге с чем-то вроде этого в onAttach mCallback = (PedometerActivity) деятельности вашего фрагмента;

В качестве альтернативы вы можете использовать библиотеку, которая намного удобнее и универсальнее. Otto - это библиотека с квадрата, вы можете думать об этом как о универсальном интерфейсе. Вам не нужно будет регистрировать интерфейсы повсюду, вы получите Post ваши данные, а метод Subscribe, который вы определяете, будет получать и обрабатывать данные любым способом. Вы можете связываться между фрагментами, действиями, классом и т. Д. С помощью Otto. Я настоятельно рекомендую вам проверить это.

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