Android Fragment Orientation导致附加问题

时间:2016-02-10 02:04:23

标签: java android android-fragments android-orientation

大家好,我有一个关于旋转片段的问题,并在分离后恢复它们。目前我有三个片段:Fragment_Data,Fragment_Log和Fragment_Control。我的问题是如果我旋转Fragment_Data,然后分离并添加Fragment_Log,然后分离Fragment_Log并尝试附加无法重新附加的片段数据。如果我将设备保持垂直并重复相同的步骤,则片段不会重新连接任何问题。我尝试在PanelManager方法中分离,添加和附加片段。

在Fragment_Data的生命周期中,在尝试重新连接时会导致问题的确切原因是什么?

MainActivty.java

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, FragmentControl.ButtonSetListener{

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentControlTransction = fragmentManager.beginTransaction();
FragmentTransaction fragmentDataTransaction = fragmentManager.beginTransaction();

FragmentControl fragmentControl = new FragmentControl();
FragmentData fragmentData = new FragmentData();
FragmentLog fragmentLog = new FragmentLog();
FragmentGraph fragmentGraph = new FragmentGraph();

//Create Fragment Manager
FragmentManager panelManager = getFragmentManager();

//Boolean values for panels
boolean data_panel = true;      //True because it is the first panel created in the View; id = 1
boolean log_panel = false;      //id = 2
boolean graph_panel = false;    //id = 3

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

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

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();
    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    // However, if we're being restored from a previous state,
    // then we don't need to do anything and should return or else
    // we could end up with overlapping fragments.
    if(savedInstanceState != null){
        return;
    }

    //Generate Fragment_Data and Fragment_Control Panels
    //These are the first two panels introduced into the app
    fragmentControlTransction.add(R.id.fragment_control_panel, fragmentControl, "control");
    fragmentControlTransction.commit();

    fragmentDataTransaction.add(R.id.fragment_data_panel, fragmentData, "data");
    fragmentDataTransaction.commit();
}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.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);
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {

    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.data_log) {
        PanelManager(2);
    } else if (id == R.id.data_graph) {
        PanelManager(3);
    } else if (id == R.id.nav_share) {
        PanelManager(1);
    } else if (id == R.id.nav_send) {

    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

private void PanelManager(int panel_id){

    if(panel_id == 1){
        //detach any panel attached to the fragment_data_panel
        panelManager.beginTransaction().detach(getFragmentManager().findFragmentById(R.id.fragment_data_panel)).commit();
        //Switch to data panel since it already exists
        panelManager.beginTransaction().attach(fragmentData).commit();

    } else if(panel_id == 2){
        //detach any panel attached to the fragment_data_panel
        panelManager.beginTransaction().detach(getFragmentManager().findFragmentById(R.id.fragment_data_panel)).commit();
        //Switch to log panel
        if(log_panel == false){
            //If log panel is false, create log_panel for the first time
            log_panel = true;
            panelManager.beginTransaction().add(R.id.fragment_data_panel, fragmentLog).commit();
        } else {
            //Log_panel exists, so just attach fragment back
            panelManager.beginTransaction().attach(fragmentLog).commit();
        }

    } else if(panel_id == 3){
        //detach any panel attached to the fragment_data_panel
        panelManager.beginTransaction().detach(getFragmentManager().findFragmentById(R.id.fragment_data_panel)).commit();
        //Switch to graph panel
        if(graph_panel == false){
            //If log panel is false, create graph_panel for the first time
            graph_panel = true;
            panelManager.beginTransaction().add(R.id.fragment_data_panel, fragmentGraph).commit();
        } else {
            //Log_panel exists, so just attach fragment back
            panelManager.beginTransaction().attach(fragmentGraph).commit();
        }
    }

}

//Call updateList method in FragmentLog to update ListView
@Override
public void app_log_update(String data, int icon) {
    FragmentLog fragmentLog = (FragmentLog)getFragmentManager().findFragmentById(R.id.fragment_data_panel);
    fragmentLog.updateList(data, icon);
}

}

FragmentData.java

public class FragmentData extends Fragment implements View.OnClickListener{

public EditText message_text;
public TextView display_message;

public Button button;
public String return_message = null;

boolean has_text_entered = false;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        return_message = savedInstanceState.getCharSequence("savedText").toString();
    }
}

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

    button = (Button)view.findViewById(R.id.set_text_button);
    button.setOnClickListener(this);

    display_message = (TextView) view.findViewById(R.id.display_message);
    display_message.setText("This is a temp statement");
    if(return_message != null){
        display_message = (TextView) view.findViewById(R.id.display_message);
        display_message.setText(return_message);
    }

    return view;
}

@Override
public void onClick(View v) {
    has_text_entered = true;
    message_text = (EditText)getActivity().findViewById(R.id.text_message);
    String message = message_text.getText().toString();

    display_message = (TextView)getActivity().findViewById(R.id.display_message);
    display_message.setText(message);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    TextView text = (TextView)getActivity().findViewById(R.id.display_message);
    CharSequence userText = text.getText();
    if(userText != null){outState.putCharSequence("savedText", userText);}
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
}

}

感谢大家的帮助!

0 个答案:

没有答案