2

두 개의 단편으로 된 단일 활동이 있습니다. 액티비티에는 세로 및 가로 방향에 대한 레이아웃이 다르지만 조각은 동일하게 유지됩니다 (태그로 만들고 재사용 됨). 하나의 조각에서 나는 XML을 정의 textview, 그리고 안드로이드 : freezesText = "사실"라인을 가지고 있지만 여전히 화면 회전 후 텍스트를 느슨하게. 왜 이런 일이 일어날 수 있겠습니까? android : freezesText가 true로 설정되어 있어도 Android TextView 콘텐츠가 손실됩니다.

조각의 레이아웃 :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center_horizontal" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/tvDisplay" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_margin="@dimen/dip10" 
     android:freezesText="true" 
     android:gravity="center" 
     android:text="@string/hello_world" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

</LinearLayout> 

조각의 클래스 :

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class DisplayFrag extends Fragment { 

    @Override 
    public View 
      onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.display_frag, container, false); 
     TextView tvDisplay = (TextView) view.findViewById(R.id.tvDisplay); 
     tvDisplay.setText(getArguments().getString(Keys.NAME) 
       + ", how are you? your phone number is " + getArguments().getString(Keys.PHONE)); 
     return view; 
    } 
} 

활동 :

import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.view.View; 
import android.widget.EditText; 

public class MainActivity extends FragmentActivity { 

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

     FragmentManager fragMan = getSupportFragmentManager(); 
     InputFrag inputFrag = (InputFrag) fragMan.findFragmentByTag(Keys.TAG_INPUT_FRAG); 
     if (inputFrag == null) { 
      fragMan.beginTransaction().add(R.id.hook1, new InputFrag(), Keys.TAG_INPUT_FRAG) 
        .commit(); 
     } else { 
      fragMan.beginTransaction().replace(R.id.hook1, inputFrag, Keys.TAG_INPUT_FRAG).commit(); 
     } 
    } 

    public void submit(View view) { 
     FragmentManager fragMan = getSupportFragmentManager(); 
     DisplayFrag displayFrag = (DisplayFrag) fragMan.findFragmentByTag(Keys.TAG_DISPLAY_FRAG); 
     if (displayFrag == null) { 
      displayFrag = new DisplayFrag(); 
      displayFrag = putBundle(displayFrag); 
      fragMan.beginTransaction().add(R.id.hook2, displayFrag, Keys.TAG_DISPLAY_FRAG).commit(); 
     } else { 
      fragMan.beginTransaction().replace(R.id.hook2, displayFrag, Keys.TAG_DISPLAY_FRAG) 
        .commit(); 
     } 

    } 

    private DisplayFrag putBundle(DisplayFrag displayFrag) { 
     Bundle bundle = new Bundle(); 
     bundle.putString(Keys.NAME, ((EditText) findViewById(R.id.etName)).getText().toString()); 
     bundle.putString(Keys.PHONE, ((EditText) findViewById(R.id.etPhone)).getText().toString()); 
     displayFrag.setArguments(bundle); 
     return displayFrag; 
    } 
} 

(제대로 동작하는 다른 조각의 버튼에 응답 제출).

답변

0

해결책을 찾았습니다. 조각을 전혀 다시 만들지 않아도됩니다. MainActivity 및 DisplayFrag에 대한 새로운 코드는 다음과 같습니다.

import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.view.View; 
import android.widget.EditText; 

public class MainActivity extends FragmentActivity { 

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

     FragmentManager fragMan = getSupportFragmentManager(); 
     InputFrag inputFrag = (InputFrag) fragMan.findFragmentByTag(Keys.TAG_INPUT_FRAG); 
     if (inputFrag == null) { 
      fragMan.beginTransaction().add(R.id.hook1, new InputFrag(), Keys.TAG_INPUT_FRAG) 
        .commit(); 
     } 

     DisplayFrag displayFrag = (DisplayFrag) fragMan.findFragmentByTag(Keys.TAG_DISPLAY_FRAG); 
     if (displayFrag == null) { 
      fragMan.beginTransaction().add(R.id.hook2, new DisplayFrag(), Keys.TAG_DISPLAY_FRAG) 
        .commit(); 
     } 
    } 

    public void submit(View v) { 
     String name = ((EditText) findViewById(R.id.etName)).getText().toString(); 
     String phone = ((EditText) findViewById(R.id.etPhone)).getText().toString(); 
     if (!"".matches(name) && !"".matches(phone)) { 
      FragmentManager fragMan = getSupportFragmentManager(); 
      DisplayFrag displayFrag = 
        (DisplayFrag) fragMan.findFragmentByTag(Keys.TAG_DISPLAY_FRAG); 
      if (displayFrag != null) { 
       displayFrag.display(name, phone); 
      } 
     } 
    } 
} 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class DisplayFrag extends Fragment { 

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

    public void display(String name, String phone) { 
     TextView tvDisplay = (TextView) getActivity().findViewById(R.id.tvDisplay); 
     tvDisplay.setText(name + ", how are you? your phone number is " + phone); 
    } 

} 

내 대답을 지금 받아들입니다. 다른 사람이 공유 할 수있는 다른 답변, 조언 또는 지식이 있으면 다른 대답을 기꺼이 받아 들일 것입니다.

-1

활동/활동이를 추가하여 방향 변경 동작을 재정의의 AndroidManifest.xml에서 활동을 수정

<activity android:name=".activity.LoginActivity" 
      android:configChanges="orientation|keyboardHidden" 
      android:label="@string/app_name"> 
</activity> 
+0

키보드를 표시하거나 숨기는 것이 아닙니다. –

0

그것은 당신 때문에 활동

android:configChanges="orientation|keyboardHidden" 

그것은 다소 다음과 같아야합니다 매번 새로운 프래그먼트를 생성하십시오. 당신은 단순히 savedInstanceState를 체크함으로써 그것을 할 수있다. 나의 예가 기분이 나아질 수 있기를 바랍니다.

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

    if (savedInstanceState == null){ 
     fragMan.beginTransaction().add(R.id.hook1, new InputFrag()) 
       .commit(); 

     fragMan.beginTransaction().add(R.id.hook2, new DisplayFrag()) 
       .commit(); 
    } 

} 

이 버그는 특정 버전에서 발생합니다.

@Override protected void onSaveInstanceState(Bundle outState) { 
    // first saving my state, so the bundle wont be empty. 
    // http://code.google.com/p/android/issues/detail?id=19917 
    outState.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE"); 
    super.onSaveInstanceState(outState); 
} 

조각 못해 정말 문제를 해결

android:configChanges="orientation 

에 의해 설정, 활동에서 서로 다른 라이프 사이클을 가지고있다.