Android: Can't update textview in Fragment fro

2019-09-19 15:44发布

问题:

I'm trying to update textview in fragment from another activity. But I'm getting a NUllPointerException when calling the setText method. I have tried the following, but still getting the NPE. 1. Tried accessing the fragments textview with FindViewbyId in activity. 2. Tried using a method in fragment and calling it from activity and passing the value as parameters

FragHome Activity

public class FragHome 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);

    //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) {

}
}

Pager

  public class Pager extends FragmentStatePagerAdapter {

//integer to count number of tabs
int tabCount;

//Constructor to the class
public Pager(FragmentManager fm, int tabCount) {
    super(fm);
    //Initializing tab count
    this.tabCount= tabCount;
}

//Overriding method getItem
@Override
public Fragment getItem(int position) {
    //Returning the current tabs
    switch (position) {
        case 0:
            Tab1 tab1 = new Tab1();
            return tab1;
        case 1:
            Tab2 tab2 = new Tab2();
            return tab2;
        case 2:
            Tab3 tab3 = new Tab3();
            return tab3;
        default:
            return null;
    }
}

//Overriden method getCount to get the number of tabs
@Override
public int getCount() {
    return tabCount;
}
}

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/textviewtemp"
    android:layout_centerInParent="true"/>

 </RelativeLayout>

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">

<!-- our toolbar -->
<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"/>

<!-- our tablayout to display tabs  -->
<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"/>

<!-- View pager to swipe views -->
<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"/>

  </LinearLayout>    

The NPE occurs when I try to settext from the activity. Please help

回答1:

Use below callback:

Fragment Class:

public class FragmentOne extends Fragment {


private ViewCallback mCallback;

 public FragmentOne(ViewCallback mCallback) {
    this.mCallback = mCallback;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_one, container, false);
    mCallback.updateTextView((TextView) view.findViewById(R.id.fragmentTextView));
    return view;
}

public interface ViewCallback {
    void updateTextView(TextView view);
}
}

Below is the Activity class:

public class MainCallbackActivity extends Activity implements CallbackFragment.ViewCallback {

public TextView textView;

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

    FragmentOne fragment = new FragmentOne(this);
    getFragmentManager().beginTransaction().add(R.id.frameLayout, fragment).commit();

}

@Override
protected void onResume() {
    super.onResume();
    if (textView != null)
        textView.setText("Updating Fragment TextView in Activity..!!");
}

@Override
public void updateTextView(TextView view) {
    this.textView = view;
}
}

Implment that call back in your activity class..then update the textview.