-1

Tabsアンドロイド:活動

からアップデートタブのレイアウト(断片)textviewsは私がtablayoutとviewpagerを使用して、タブのビューを作成しています。私は各タブごとに1つのフラグメントを使用します。私のMainActivityでは、デバイスからBluetooth経由でいくつかの値を取得しています。値は単一の文字列として受け取り、それを分割して対応するタブに設定します。しかし、自分のアクティビティからフラグメントのtextviewのsetTextメソッドを呼び出そうとすると、NullPointerExceptionが発生します。 誰でも私のMainActivityから各フラグメントのtextviewsを更新する方法を教えてもらえますか?同様に、温度タブを選択した場合、温度断片のテキストビューはMainActivityの値で更新する必要があります。助けてください

活動

public class MainActivity extends AppCompatActivity implements TabLayout.OnTabSelectedListener { 

    Handler bluetoothIn; 
    private static TextView tmpF, humF, CoF; 
    String tempGL, HumGL, coGL, devname; 
    double dblTemp, dblCo; 
    final int handlerState = 0; // used to identify handler message 
    private BluetoothAdapter btAdapter = null; 
    private TabLayout tabLayout; 
    private ViewPager viewPager; 

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

tmpF = (TextView)findViewById(R.id.txt_temp_val); 
humF = (TextView)findViewById(R.id.txt_hum_val); 
co = (TextView)findViewById(R.id.txt_co_val); 

//Adding toolbar to the activity 
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 
//Initializing the tablayout 
tabLayout = (TabLayout) findViewById(R.id.tabLayout); 
//Initializing viewPager 
viewPager = (ViewPager) findViewById(R.id.pager); 
//Adding the tabs using addTab() method 
tabLayout.addTab(tabLayout.newTab().setText("Temperature")); 
tabLayout.addTab(tabLayout.newTab().setText("Humidity")); 
tabLayout.addTab(tabLayout.newTab().setText("CO")); 
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

//Creating our pager adapter 
Pager adapter = new Pager(getSupportFragmentManager(), tabLayout.getTabCount()); 

//Adding adapter to pager 
viewPager.setAdapter(adapter); 
viewPager.setOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
//Adding onTabSelectedListener to swipe views 
tabLayout.setOnTabSelectedListener(this); 

bluetoothIn=new Handler() { 

    String readMessage; 
    String[] values = new String[]{""}; 

    public void handleMessage(android.os.Message msg) { 

     if (msg.what == handlerState) { 

      readMessage = (String) msg.obj; 
      values = readMessage.split("#"); 
      for (int j = 0; j < values.length; j++) { 

       int rem = j % 3; 

       if (rem == 0) { 

        tmpF.setText(values[j] + " C"); 
        tempGL = String.valueOf(values[j]); 

        try { 
         dblTemp = Double.parseDouble(tempGL); 
        } catch (NumberFormatException e) { 
         e.printStackTrace(); 
        } 

       } else if (rem == 1) { 

        CoF.setText(values[j] + " ppm"); 
        coGL = values[j]; 
        try { 
         dblCo = Double.parseDouble(coGL); 
        } catch (NumberFormatException e) { 
         e.printStackTrace(); 
        } 

       } else if (rem == 2) { 
        humF.setText(values[j] + " %"); 
        HumGL = values[j]; 
       } 
      } 
     } 
    } 
}; 

btAdapter=BluetoothAdapter.getDefaultAdapter(); // get Bluetooth 
} 

@Override 
public void onTabSelected(TabLayout.Tab tab) { 
// mViewPager.setCurrentItem(tab.getPosition()); 

} 

@Override 
public void onTabUnselected(TabLayout.Tab tab) { 

} 

@Override 
public void onTabReselected(TabLayout.Tab tab) { 

} 
} 

Tab1を

public class OneFragment extends Fragment { 

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

} 
} 

fragment_one.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" 
tools:context="shinil.tablayout.OneFragment" 
android:id="@+id/rltnvnv"> 

<TextView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="Temperature" 
android:textSize="40dp" 
android:textStyle="bold" 
android:id="@+id/txt_temp_val" 
android:layout_centerInParent="true"/> 

</RelativeLayout> 

Logcat

Caused by: java.lang.NullPointerException: Attempt to invoke virtual  method 'void  android.support.v4.view.ViewPager.setAdapter(android.support.v4.view.PagerAdapter)' on a null object reference at shinil.airopure.MainActivity.onCreate(MainActivity.java:194) 

frag_home.xml

<LinearLayout 
    android:id="@+id/main_layout" 
    android:orientation="vertical" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity"> 


    <android.support.v7.widget.Toolbar 
android:id="@+id/toolbar" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:background="?attr/colorPrimary" 
android:minHeight="?attr/actionBarSize" 
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> 


    <android.support.design.widget.TabLayout 
    android:id="@+id/tabLayout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="?attr/colorPrimary" 

    android:minHeight="?attr/actionBarSize" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> 


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

</LinearLayout> 
+0

コードを投稿してください。 –

+0

activity_frag_home.xmlを表示してください。 – Pooya

+0

@Pooyaが更新されました! –

答えて

1

こんにちは私は私が正しくあなたの問題を理解してかはわからないが、私は助けるために試してみましょう。私はあなたのViewPagerアダプタがあなたのポケットベルアダプタにFragmentStatePagerAdapter

まずから延びていると仮定し

は、以下のようなあなたの破片のためのSparseArrayを定義します。

SparseArray<Fragment> myPagerFragments= new SparseArray<>(); 

アダプタのinstantiateItem方法では、あなたのsparsearrayにあなたのフラグメントを追加します。

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
     Fragment fragment = (Fragment) super.instantiateItem(container, position); 
     myPagerFragments.put(position, fragment); 
     return fragment; 
    } 

そして、あなたのdestroyItem方法であなたのsparsearrayからあなたの断片を削除します。

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
     myPagerFragments.remove(position); 
     super.destroyItem(container, position, object); 
    } 

以下likewあなたのポケットベルのフラグメントを返し、あなたの特殊なアダプタへのメソッドの追加:

public void setText(String text){ 
    myTextView.setText(text); 
} 

:あなたの断片で

public Fragment getRegisteredFragment(int position) { 
     return myPagerFragments.get(position); 
    } 

を以下likewあなたのTextViewのテキストを変更するパブリックメソッドを定義しますあなたのアクティビティでアダプタを定義し、下記のようにViewPagerにonPageChangeListenerを追加してください:

MyPagerAdapter mAdapter = new MyPagerAdapter(context,items); 
myViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

    } 

    @Override 
    public void onPageSelected(int position) { 
     Fragment myPagerFragment = mAdapter.getRegisteredFragment(position); 
     if(fragment != null){ 
      ((YourFragment)fragment).setText("Hello World!"); 
     } 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 

    } 
}); 

私はこれがあなたを助けてくれることを願っています。がんばろう。

+0

あなたのコードを試しましたが、まだNPEを手に入れました。とにかくお返事ありがとうございます –

+0

これは、ビューページに添付された断片のデータをどのように変更できるかについての実用的な解決策です。あなたのlogcatで見ることができるように、あなたのビューページはnullです。アダプタを設定することはできません。 – savepopulation

関連する問題