2017-01-23 4 views
-2

私は、ViewPagerのツールバーonCreateOptionsMenuのDBから読み込まれたスピナーを持っており、その値をフラグメントに渡したいと思います。ツールバースピナーの値をViewPagerフラグメントに渡す方法

私が達成したいのは、スピナー値に基づいてフラグメントの内容を変更することです。 私は賭け

...私はバンドルを経由して、この値を渡そうとしましたが、それは私null object referenceをスローし、そのための断片と、それはものだが速く私のスピナーがバンドルにして、その値をgetingさよりもロードされます。それでも、私は正しい方法でこの値を渡す方法を知りません...

ありがとうございました!

EDIT:

私は問題を解決する方法を見つけるが、私は別のものを打ちます。ヌル以外のアクティビティにvaluteを送ることはできません。

ChartsActivity.java

public class ChartsAcivity extends AppCompatActivity { 

Context context = this; 
int selected_car_id = 0; 
DBHelper dbHelper; 
String spinnerValue = null; 

private ViewPager mViewPager; 

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

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

    if (getSupportActionBar() != null){ 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
    } 

    SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

    Chart1Activity chart1 = (Chart1Activity) mSectionsPagerAdapter.getItem(0); 
    if (spinnerValue != null) chart1.respond("test"); 
    else chart1.respond("OMG EMPTY AGAIN?!?!"); 

    mViewPager = (ViewPager) findViewById(R.id.container); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(mViewPager); 

} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.menu_charts_acivity, menu); 
    MenuItem carSpinner = menu.findItem(R.id.charts_activ_car_spinner); 
    Spinner CarRefuelListSpinner = (Spinner) MenuItemCompat.getActionView(carSpinner); 
    SQLiteDatabase db = new DBHelper(this).getWritableDatabase(); 
    Cursor spinner_cursor = db.rawQuery("SELECT " + TableCar.NewCar.CAR_ID + " AS _id, " + TableCar.NewCar.CAR_NAME + " FROM " + TableCar.NewCar.TABLE_NAME, null); 

    if(spinner_cursor.moveToFirst()) { 

     String[] from = new String[]{TableCar.NewCar.CAR_NAME}; 
     int[] to = new int[]{android.R.id.text1}; 

     SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, spinner_cursor, from, to); 
     simpleCursorAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     CarRefuelListSpinner.setAdapter(simpleCursorAdapter); 

     CarRefuelListSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 

       ((TextView) parent.getChildAt(0)).setTextColor(Color.WHITE); 

       selected_car_id = Integer.valueOf(String.valueOf(id)); 

       String s = String.valueOf(selected_car_id); 
       getSpinnerVal(s); 
       //chart1.respond("test"); 


       //Chart1Activity chart1 = (Chart1Activity) mSectionsPagerAdapter.getItem(0); 
       //chart1.respond(s); 

      } 

      public void onNothingSelected(AdapterView<?> parent) { 

      } 
     }); 
    } 
    else { 
     ... 
    } 


    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    int id = item.getItemId(); 

    switch (item.getItemId()) { 
     case android.R.id.home: 

      onBackPressed(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

public void getSpinnerVal (String value){ 

    spinnerValue = value; 

} 

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 


     switch (position){ 
      case 0: 
       Chart1Activity chart1 = new Chart1Activity(); 
       return chart1; 

      case 1: 
       Chart2Activity chart2 = new Chart2Activity(); 
       return chart2; 

      case 2: 
       Chart3Activity chart3 = new Chart3Activity(); 
       return chart3; 

      default: 
       return null; 
     } 
    } 

    @Override 
    public int getCount() { 
     // Show 3 total pages. 
     return 3; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 
      case 0: 
       return "TEST 1"; 
      case 1: 
       return "TEST 2"; 
      case 2: 
       return "TEST 3"; 
     } 
     return null; 
    } 
} 
} 

Chart1Activity.java

public class Chart1Activity extends Fragment implements FragmentCommunicator{ 

Context context;// = getActivity(); 
DBHelper dbHelper; 
LineChart chart; 
String car_id = null; 
String test = null; 

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

    if (car_id != null) { 
     chart = (LineChart) getActivity().findViewById(R.id.chart1_line_fuel_usage); 
     Toast.makeText(getActivity(), "ID = " + car_id, Toast.LENGTH_LONG).show(); 
     setData(car_id); 
    } 
    else Toast.makeText(getActivity(), "ID = null", Toast.LENGTH_LONG).show(); 

    return rootView; 
} 

@Override 
public void respond(String data) { 
    car_id = data; 
} 

public void setData(String car_id){ 

    dbHelper = new DBHelper(context); 

    Cursor curChartFuelUsage = dbHelper.getChartFuelUsage(car_id); 
    curChartFuelUsage.moveToFirst(); 

    int count = curChartFuelUsage.getCount(); 
    final String[] x_refuel_data = new String[count]; 
    final String[] x2_refuel_data = new String[count]; 
    Float[] y_fuel_usage = new Float[count]; 


    if (curChartFuelUsage.moveToFirst()){ 

     for (int i = 0 ; i < count ; i++){ 

      x_refuel_data[i] = curChartFuelUsage.getString(0); 
      x2_refuel_data[i] = x_refuel_data[i].replace("-", "/"); 

      y_fuel_usage[i] = curChartFuelUsage.getFloat(1); 
      curChartFuelUsage.moveToNext(); 
     } 

     ArrayList<Entry> values = new ArrayList<Entry>(); 

     for (int i = 0 ; i < count ; i++){ 
      values.add(new Entry(i, y_fuel_usage[i])); 
     } 

     LineDataSet set1 = new LineDataSet(values,"test"); 
     set1.setAxisDependency(YAxis.AxisDependency.LEFT); 
     set1.setColors(new int[]{R.color.chartRed}, context); 

     ArrayList<ILineDataSet> dataSets = new ArrayList<ILineDataSet>(); 
     dataSets.add(set1); 

     LineData lineData = new LineData(dataSets); 
     chart.setData(lineData); 

     IAxisValueFormatter formatter = new IAxisValueFormatter() { 

      @Override 
      public String getFormattedValue(float value, AxisBase axis) { 
       return x2_refuel_data[(int)value]; 
      } 

      @Override 
      public int getDecimalDigits() { 
       return 0; 
      } 
     }; 

     chart.getXAxis().setValueFormatter(formatter); 
     chart.invalidate(); 


    } 
    else Toast.makeText(context, "xxx.", Toast.LENGTH_LONG).show(); 

} 
} 

FragmentCommunicator.java

public interface FragmentCommunicator { 

    public void respond (String data); 
} 

error

+0

[Avoiding!= nullステートメント]の可能な複製(http://stackoverflow.com/questions/271526/avoiding-null-statements) – Chisko

答えて

0

これは同じAでありますフラグメント間のコミュニケーション... Fragment Communicationについてのこのビデオを見ることをお勧めします。私はそれがあなたに多くの助けとあなたのコードをより組織化すると確信しています

+0

編集私のポスト。私は、アクティビティから値をフラグメントに送るためにインターフェイスを使用する必要があることがわかりましたが、null値を常に送信する理由を見つけることができません... – relliz

+0

あなたは他の方法でそれをやっています...あなたのアクティビティは、 'FragmentCommunicator'とあなたのフラグメントには、<<<<をオーバーライドするOnAttach(コンテキストコンテキスト)の中で宣言するインターフェース' FragmentCommunicator'のフィールドが必要です。これは、フラグメントのデータをアクティビティに送信する方法です – MohammedAlSafwan

+0

アクティビティからデータを送信します断片とは異なる。あなたのアクティビティであなたのfragmentManagerを取得し、それを見なければなりません。フラグメントを見つけたら、それをフラグメントにキャストした後にそのメソッドを呼び出します – MohammedAlSafwan

関連する問題