0

My App uses ActionBar Tab Fragments to Create/Modify Device Details. The Device properties of categorized into different fragments. I want to initialize each fragments in OnCreate of Tab Activity. In each tab fragment has SetValues method which initializes values to view in the fragment. I noticed that fragment is created when i clicked on particular Tab.

Tab Activity

public class CameraDetails extends Activity {
 private CameraData camera = new CameraData();

 Fragment network = new NetworkFragment();
 Fragment remoteUser = new RemoteUserFragment();

 private G.Interface mNetworkInterface = null;
 private G.Interface mRemoteUserInterface = null;    

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.cameradetails);

    ActionBar actionBar = getActionBar();
    actionBar.setDisplayShowHomeEnabled(false);
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    // network tab
    ActionBar.Tab tab = actionBar.newTab();
    tab.setText("Network");
    tab.setIcon(R.drawable.ic_launcher);
    tab.setTabListener(new TabListener(network));
    actionBar.addTab(tab);

    // remote user tab
    tab = actionBar.newTab();
    tab.setText("Remote User");
    tab.setIcon(R.drawable.ic_launcher);
    tab.setTabListener(new TabListener(remoteUser));
    actionBar.addTab(tab);

    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
      @Override
      public void run() {
          init();
      }
    }, 1000);
}

public void init(){
    try{
        byte[] by = new byte[512];
        String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
        File file = new File(extStorageDirectory, "dump.hex");
        BufferedInputStream in = new BufferedInputStream( new FileInputStream(file));
        in.read(by);
        in.close();
        camera.set( by );

        mNetworkInterface.SetValues();
        mRemoteUserInterface.SetValues();           

    } catch(Exception e){
        e.printStackTrace();
    }

}

public CameraData getCameraData(){
    return camera;
}

public void setNetworkListener( G.Interface Interface ){
    this.mNetworkInterface = Interface;
}

public void setRemoteUserListener( G.Interface Interface ){
    this.mRemoteUserInterface = Interface;
}
}

one of the fragment tab

public class NetworkFragment extends Fragment implements G.Interface {
View rootView;
Activity mActivity;
CameraData camera;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.network_layout, container, false);
    Log.i("NetworkFragment", "CreateView");
    return rootView;
}

@Override
public void onAttach(Activity activity) {
    mActivity = activity;
    ((CameraDetails)mActivity).setNetworkListener(this);
    camera = ((CameraDetails)mActivity).getCameraData();
    Log.i("NetworkFragment", "Activity Attached");
    super.onAttach(activity);
}

@Override
public void SetValues() {
    try {
        // ip address
        EditText et = (EditText)rootView.findViewById(R.id.cd_ip_address);
        et.setText(camera.mNetwork.IPAddress);

        // subnet mask
        et = (EditText)rootView.findViewById(R.id.cd_subnetmask);
        et.setText(camera.mNetwork.SubnetMask);

        // gateway
        et = (EditText)rootView.findViewById(R.id.cd_gateway);
        et.setText(camera.mNetwork.Gateway);

        // com port
        et = (EditText)rootView.findViewById(R.id.cd_comm_port);
        et.setText(""+camera.mNetwork.CommPort);

        // mimg port
        et = (EditText)rootView.findViewById(R.id.cd_mimg_port);
        et.setText(""+camera.mNetwork.MImgPort);

        // webserver port
        et = (EditText)rootView.findViewById(R.id.cd_web_server_port);
        et.setText(""+camera.mNetwork.WebServerPort);

        // wifi id
        et = (EditText)rootView.findViewById(R.id.cd_wifi_id);
        et.setText(camera.mNetwork.WiFiId);

        // wifi password
        et = (EditText)rootView.findViewById(R.id.cd_wifi_pwd);
        et.setText(camera.mNetwork.WiFiPassword);

        // wifi mode
        Spinner sp = (Spinner)rootView.findViewById(R.id.cd_wifi_mode);
        sp.setSelection(camera.mNetwork.WiFiMode, true);            

        Log.i("NetworkFragment", "SetValues OK");

    } catch( Exception e ){

    }
}
}

Init method of tab activity initializes the values into fragment NetworkFragment and RemoteUserFragment. The values are initialized for NetworkFragment. But NullPointerException for RemoteUserFragment.

LOGCAT

    06-11 12:06:38.161: W/System.err(677): java.lang.NullPointerException
    06-11 12:06:38.201: W/System.err(677):  at com.mtxlabs.cameraviewer.CameraDetails.init(CameraDetails.java:114)
    06-11 12:06:38.201: W/System.err(677):  at com.mtxlabs.cameraviewer.CameraDetails$1.run(CameraDetails.java:98)
    06-11 12:06:38.201: W/System.err(677):  at android.os.Handler.handleCallback(Handler.java:615)
    06-11 12:06:38.211: W/System.err(677):  at android.os.Handler.dispatchMessage(Handler.java:92)
    06-11 12:06:38.211: W/System.err(677):  at android.os.Looper.loop(Looper.java:137)
    06-11 12:06:38.211: W/System.err(677):  at android.app.ActivityThread.main(ActivityThread.java:4745)
    06-11 12:06:38.211: W/System.err(677):  at java.lang.reflect.Method.invokeNative(Native Method)
    06-11 12:06:38.211: W/System.err(677):  at java.lang.reflect.Method.invoke(Method.java:511)
    06-11 12:06:38.211: W/System.err(677):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    06-11 12:06:38.211: W/System.err(677):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    06-11 12:06:38.211: W/System.err(677):  at dalvik.system.NativeStart.main(Native Method)

How can i solve this problem or Is other technique is used to do it.

Advance thanks

Riskhan
  • 4,434
  • 12
  • 50
  • 76
  • Which values are null? Can you show the logcat? – OneCricketeer Jun 11 '16 at 06:34
  • Try to move all usages of findViewById into OnCreateView of the Fragment. Make field variables for all the views. You can set the values later – OneCricketeer Jun 11 '16 at 06:37
  • @cricket_007 I included logcat in question – Riskhan Jun 11 '16 at 06:45
  • And what have you tried to fix the null value at the mentioned line number? – OneCricketeer Jun 11 '16 at 06:46
  • 1
    Your `camera` or `mNetworkInterface` or `mRemoteUserInterface` is **NULL** in your `init()` function in `CameraDetails` Activity. – Janki Gadhiya Jun 11 '16 at 06:50
  • 1
    Possible duplicate of [What is a NullPointerException, and how do I fix it?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – Janki Gadhiya Jun 11 '16 at 06:51
  • It would appear one of the listeners is null. In general, you need to use the following pattern for linking Fragments. It would appear you've tried it, but your interfaces are in the wrong spots. You should use callbacks, not setter methods. https://developer.android.com/training/basics/fragments/communicating.html – OneCricketeer Jun 11 '16 at 06:51
  • @cricket_007 I tried the code getActionBar().setNavigationMode(0); mNetworkInterface.SetValues(); getActionBar().setNavigationMode(1); mRemoteUserInterface.SetValues(); – Riskhan Jun 11 '16 at 06:51
  • 1
    The interfaces that you are setting in the Fragment code is not called until the tab displays the page. So, that makes sense that one of them will be null, therefore the error – OneCricketeer Jun 11 '16 at 06:55
  • @cricket_007 Yes you are right! Is any solution to solve ? – Riskhan Jun 11 '16 at 07:01
  • 1
    Read that last link? Implement Activity callbacks the documented way and pass values between the Fragments if you need to – OneCricketeer Jun 11 '16 at 07:03
  • @cricket_007 Yes i will try. Anyway thanks – Riskhan Jun 11 '16 at 07:09

1 Answers1

0

I called SetValues method in onCreateView of the fragment. Finally i solved the problem

Main Activity

public class CameraDetails extends Activity {
    private CameraData camera = new CameraData();

    Fragment network = new NetworkFragment();
    Fragment remoteUser = new RemoteUserFragment();
    Fragment rtsp = new RTSPFragmentTab();
    Fragment video = new VideoFragmentTab();
    Fragment record = new RecordFragmentTab();
    Fragment alarm = new AlarmFragmentTab();
    Fragment productinfo = new ProductInfoFragmentTab();

    private G.Interface mNetworkInterface = null;
    private G.Interface mRemoteUserInterface = null;    

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.cameradetails);

        initCameraData();

        ActionBar actionBar = getActionBar();
        actionBar.setDisplayShowHomeEnabled(false);
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        // network tab
        ActionBar.Tab tab = actionBar.newTab();
        tab.setText("Network");
        tab.setIcon(R.drawable.ic_launcher);
        tab.setTabListener(new TabListener(network));
        actionBar.addTab(tab);

        // remote user tab
        tab = actionBar.newTab();
        tab.setText("Remote User");
        tab.setIcon(R.drawable.ic_launcher);
        tab.setTabListener(new TabListener(remoteUser));
        actionBar.addTab(tab);        
    }

    public void initCameraData(){
        try{
            byte[] by = new byte[512];
            String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
            File file = new File(extStorageDirectory, "dump.hex");
            BufferedInputStream in = new BufferedInputStream( new FileInputStream(file));
            in.read(by);
            in.close();
            camera.set( by );           
        } catch(Exception e){
            e.printStackTrace();
        }

    }

    public void onClick(View v){
        getActionBar().setSelectedNavigationItem(0);
        if(!mNetworkInterface.Validate())
            return;

        getActionBar().setSelectedNavigationItem(1);
        if(!mRemoteUserInterface.Validate())
            return;

        try{
            byte[] bytes = camera.get();
            String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
            File file = new File(extStorageDirectory, "dump.hex");
            BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(file, false));
            out.write(bytes);
            out.close();
            Log.v("Data", "Setup data updated");
        } catch (Exception e) {
            e.printStackTrace();
            return ;
        }
    }

    public CameraData getCameraData(){
        return camera;
    }

    public void setNetworkListener( G.Interface Interface ){
        this.mNetworkInterface = Interface;
    }

    public void setRemoteUserListener( G.Interface Interface ){
        this.mRemoteUserInterface = Interface;
    }

}

Network Fragment

public class NetworkFragment extends Fragment implements G.Interface {
    View rootView;
    Activity mActivity;
    CameraData camera;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.network_layout, container, false);
        Log.i("NetworkFragment", "CreateView");
        SetValues();
        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        mActivity = activity;
        ((CameraDetails)mActivity).setNetworkListener(this);
        camera = ((CameraDetails)mActivity).getCameraData();
        Log.i("NetworkFragment", "Activity Attached");
        super.onAttach(activity);
    }

    @Override
    public boolean Validate() {
        try {
            String s;
            int i;

            // ip address
            camera.mNetwork.IPAddress = G.GetIPText(rootView, R.id.cd_ip_address);
            if( camera.mNetwork.IPAddress.isEmpty()){
                Toast.makeText(mActivity, "Please enter a valid ip address", Toast.LENGTH_SHORT).show();
                return false;
            }

            // subnet mask
            camera.mNetwork.SubnetMask = G.GetIPText(rootView, R.id.cd_subnetmask);
            if( camera.mNetwork.SubnetMask.isEmpty() ){
                Toast.makeText(mActivity, "Please enter a valid subnetmask", Toast.LENGTH_SHORT).show();
                return false;
            }


            // gateway
            camera.mNetwork.Gateway = G.GetIPText(rootView, R.id.cd_gateway);
            if( camera.mNetwork.Gateway.isEmpty()){
                Toast.makeText(mActivity, "Please enter a valid gateway", Toast.LENGTH_SHORT).show();
                return false;
            }

            // com port
            camera.mNetwork.CommPort = G.GetInteger(rootView, R.id.cd_comm_port);
            if( camera.mNetwork.CommPort < 0 ){
                Toast.makeText(mActivity, "Please enter a valid Communication Port", Toast.LENGTH_SHORT).show();
                return false;
            }

            // mimg port
            camera.mNetwork.MImgPort = G.GetInteger(rootView, R.id.cd_mimg_port);
            if( camera.mNetwork.MImgPort < 0 ){
                Toast.makeText(mActivity, "Please enter a valid MIMG Port", Toast.LENGTH_SHORT).show();
                return false;
            }

            // webserver port
            camera.mNetwork.WebServerPort = G.GetInteger(rootView, R.id.cd_web_server_port);
            if( camera.mNetwork.WebServerPort < 0 ){
                Toast.makeText(mActivity, "Please enter a valid webserver Port", Toast.LENGTH_SHORT).show();
                return false;
            }

            // wifi id
            camera.mNetwork.WiFiId = G.GetText(rootView, R.id.cd_wifi_id);
            if( camera.mNetwork.WiFiId.isEmpty() ){
                Toast.makeText(mActivity, "Please enter a valid WiFi Id", Toast.LENGTH_SHORT).show();
                return false;
            }

            // wifi password
            camera.mNetwork.WiFiPassword = G.GetText(rootView, R.id.cd_wifi_pwd);
            if( camera.mNetwork.WiFiPassword.isEmpty() ){
                Toast.makeText(mActivity, "Please enter a valid WiFi Password", Toast.LENGTH_SHORT).show();
                return false;
            }

            // wifi mode
            camera.mNetwork.WiFiMode = (byte)G.GetSpinnerOptions(rootView, R.id.cd_wifi_mode);
            if( camera.mNetwork.WiFiMode == -1 ){
                Toast.makeText(mActivity, "Please select a valid wifi mode from list", Toast.LENGTH_SHORT).show();
                return false;
            }

            Log.i("NetworkFragment", "Validation OK");
        } catch( Exception e ){
            e.printStackTrace();
        }
        return true;
    }

    public void SetValues() {
        try {
            // ip address
            EditText et = (EditText)rootView.findViewById(R.id.cd_ip_address);
            et.setText(camera.mNetwork.IPAddress);

            // subnet mask
            et = (EditText)rootView.findViewById(R.id.cd_subnetmask);
            et.setText(camera.mNetwork.SubnetMask);

            // gateway
            et = (EditText)rootView.findViewById(R.id.cd_gateway);
            et.setText(camera.mNetwork.Gateway);

            // com port
            et = (EditText)rootView.findViewById(R.id.cd_comm_port);
            et.setText(""+camera.mNetwork.CommPort);

            // mimg port
            et = (EditText)rootView.findViewById(R.id.cd_mimg_port);
            et.setText(""+camera.mNetwork.MImgPort);

            // webserver port
            et = (EditText)rootView.findViewById(R.id.cd_web_server_port);
            et.setText(""+camera.mNetwork.WebServerPort);

            // wifi id
            et = (EditText)rootView.findViewById(R.id.cd_wifi_id);
            et.setText(camera.mNetwork.WiFiId);

            // wifi password
            et = (EditText)rootView.findViewById(R.id.cd_wifi_pwd);
            et.setText(camera.mNetwork.WiFiPassword);

            // wifi mode
            Spinner sp = (Spinner)rootView.findViewById(R.id.cd_wifi_mode);
            sp.setSelection(camera.mNetwork.WiFiMode, true);


            Log.i("NetworkFragment", "SetValues OK");

        } catch( Exception e ){
            e.printStackTrace();
        }
    }

}

Anyway thanks @cricket_007 for helping me to understand the fragment tab operation

Riskhan
  • 4,434
  • 12
  • 50
  • 76