2011-05-06 8 views
6

메신저 정말이 우울한 정보가 너무 많아서이 질문을 다시 할 것입니다. 단편 소설은 장치 방향이 바뀌면 변경되거나 일어나는 것을 원하지 않는다는 것입니다. 이 문제에 가장 많이 사용되는 "solutuions"중 2 개는 다음과 같습니다.안드로이드 - 화면 방향을 다시로드

1. 매니페스트에 android : screenOrientation = "portrait"(또는 "landscape")를 추가하여 한 방향으로 활동을 잠글 수 있습니다.

2. 태그에 android : configChanges = "screenOrientation"을 지정하여 화면 변경 사항을 처리하겠다고 시스템에 알릴 수 있습니다. 이렇게하면 액티비티가 다시 생성되지 않고 콜백이 대신 전달됩니다.이 콜백은 유용하지 않으므로 무시해도됩니다.

이러한 작업은 수행하지 마십시오. 그래서 좀 더 자세하게 내 특정 문제를 설명하겠습니다 ...

나는 학습 연습으로 매우 간단한 응용 프로그램으로 실험하고 있습니다. 서버에 텍스트 파일이 있습니다. 텍스트 파일에는 1 개의 내용이 있습니다 : 한 줄에 하나의 정수. 이 숫자는 또한이 서버에 저장된 이미지 파일의 수이며 이미지의 이름은 모두 0.jpg, 1.jpg, 2.jpg입니다.

내 코드는 모두 내 활동의 onCreate 메서드에 있습니다. 내가 간단한 애플 리케이션을 말했다). 실행시

앱이 다음 작업을 수행합니다

는 텍스트 파일에서 숫자를 읽습니다. 파일에서 0부터 임의의 숫자를 생성하십시오. URL의 임의 번호를 사용하여 임의의 이미지를 이미지 뷰로로드합니다.

화면이 회전 할 때 나는 그 모든 일이 다시 일어나기를 원하지 않습니다. 화면이 수평으로 회전해야하고 이미지의 크기가 맞아야 만한다는 것 외에는 아무 것도 일어나지 않습니다. 화면이 회전 할 때마다 코드가 실행되고 새로운 임의의 이미지가 선택됩니다. 누군가가 나에게이 문제를 해결할 수있는 간단한 코드를 제공 해줄 수 있습니까? 나는 당신이 코드 예제를 제공하지 않는다면 도움을받지 못한다는 것을 알게된다.

미리 감사드립니다.

ps ... 메신저 뭐하는 짓을하는 다른 방법을 찾고 있지 않습니다. 요점은 아닙니다. 인스턴트 메신저를 찾고 메신저 인스턴트 메신저 현재.

+0

아, 코드에서 뭔가 잘못하고 있어야합니다 :'android : configChanges = "screenOrientation"'당신이하고 싶은 것을 처리하는 방법입니다. 제대로 설정했다면'onCreate'는 재실행되지 않습니다. 다시 실행하면 잘못 설정 한 것입니다. 질문의 본문에 코드를 넣으면 대답이 꽤 간단해야한다고 생각합니다. – Femi

+1

hhmmm ... 뭐가 잘못 구성하는거야? 만약 내가해야만하는 유일한 일은 내 단정 지에 그 한 줄을 덧붙이는 것이고, 내가 그 잘못을 어떻게 할 수 있겠는가? –

+0

그게 내가 확신 할 수없는 이유이고, 왜 내가 당신의 코드를 보도록 요청했는지. 나는 방향을 바꿀 때마다'onCreate()'를 실행하지 않는 코드를 가지고있다. – Femi

답변

3

매우 비슷한 질문은 여기에 있습니다 : Don't reload application when orientation changes

어쨌든, 우선 다른 방법에서 onCreate에서 코드를 변경하고 "로 설정 이미지"인터넷에서 임의의 숫자 및로드 이미지를 생성 "하여 분할한다 보기 ".

활동에 비트 맵이 있으며, 활동이 시작될 때마다 null인지 확인합니다.

(있는 경우) 모두 수행하십시오. 그렇지 않다면 ImageView 또는 가지고있는 비트 맵을 설정하십시오.

이 작동
Bitmap image = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

image = (Bitmap) getLastNonConfigurationInstance(); 

    if(bitmap == null){ 
     image = downloadImage(); 
     } 
    setImage(bitmap); 
} 


@Override 
public Object onRetainNonConfigurationInstance() { 
    return bitmap; 
} 

, 난 100 % 확신 : 그것은 사용을 회전 할 때

는 비트 맵을 파괴하지 않도록합니다.

<activity android:name=".Explorer" android:label="@string/app_name" 
      android:configChanges="orientation" android:launchMode="standard"> 
     </activity> 

을 한 후 바로 기본 함수를 재정의 :

+1

예, 내 질문입니다. 솔루션 중 어느 것도 작동하지 않습니다. 사람들은 코드를 테스트하지 않고이 물건을 계속 게시합니다. 좀 우스운. –

+0

@NeTeInStEiN : 그것은 JJD의 동일한 질문입니다. – techiServices

+0

여기에서 검색하는 데이터는 구성 변경을 처리하기위한 최적화 용도로만 사용해야합니다. null 포인터를 항상 처리 할 수 ​​있어야하며이 함수가 null을 반환하더라도 액티비티는 이전 상태 (정상 onSaveInstanceState (Bundle) 메커니즘을 통해)로 되돌릴 수 있어야합니다. – techiServices

0

예를 들어, 매니페스트에 추가

@Override 
     public void onConfigurationChanged(Configuration _newConfig){ 
      super.onConfigurationChanged(_newConfig); 
int height = getWindowManager().getDefaultDisplay().getHeight(); 
     int width = getWindowManager().getDefaultDisplay().getWidth(); 
     if(width > height){ 
// layout for landscape 
}else{ 
// layout for portrait 
     } 
      } 

참고 :이 기능을 오버라이드 (override)하는 경우는, 레이아웃 자신을 다시 실행해야합니다. 그것은 당신이 원하는 것을 할 수있는 유일한 방법입니다. 안드로이드가 화면 크기를 고정시키는 방법은 전체 활동을 날려 버리고 다시 새로운 차원으로 끌어 올리는 것입니다. 액티비티를 날려 버리지 않으려면 화면 크기 변경을 처리해야합니다. 다른 옵션은 없습니다.

편집 :이 특정 응용 프로그램에서 세로로 표시되는 표 및 가로로 표시되는 차트가 있습니다. 그래서 나는이 작업을 수행 :

void showDataView() 
    { 
     setContentView(mainView); 
     currentView = mainView; 
    } 

    void showGraphView() 
    { 
     if(currentView == mainView){ 
      if(graphView == null){ 
       setContentView(R.layout.graphview); 
       graphView = (GraphView)findViewById(R.id.graphview); 
      } 
      setContentView(graphView); 
      currentView = graphView; 
      graphView.setDataToPlot(DATA_TO_PLOT); 
      graphView.clear(); 
     } 
    } 

@Override 
    public void onConfigurationChanged(Configuration _newConfig){ 
     super.onConfigurationChanged(_newConfig); 
     int height = getWindowManager().getDefaultDisplay().getHeight(); 
     int width = getWindowManager().getDefaultDisplay().getWidth(); 
     if(width > height){ 
      showGraphView(); 
     }else{ 
      showDataView(); 
     } 
     if(graphView != null) graphView.setGraphWidth(width); 
    } 

매번 방향 변경, 나는 다른 하나의 콘텐츠보기를 전환합니다. 귀하의 경우에는 invalidate 현재 루트보기 수 있으며 제대로 다시 그려 볼 수 있습니다.

이 때문에 플랫폼에서 처리해야하므로이 헛소리를 처리하지 않습니다. onSaveInstanceState을 사용하여 필요한 특정 데이터를 보존 한 다음 해당 데이터를 onCreate에 체크인 한 다음 사용하는 것이 좋습니다. 그에 대한 정보는 http://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges을 참조하십시오.

+0

괜찮아요. 그리고 그 코드를 넣고 있습니다? 내 활동에 onCreate 전에? –

+0

@ Femi 이것은 오직 진실한 대답입니다. 화면 방향을 강요하고 그 상태를 유지하는 것이 가장 좋음을 발견했습니다. 특히 그것이 무거운 자산의 예술 자산 일 경우 특히 그렇습니다. 그래서 시장에 나와있는 대부분의 게임은 방향을 강제로 바꾸고 변경을 허용하지 않습니다. – SRM

+0

그리고 "가로 레이아웃"과 "세로 레이아웃"의 내용은 무엇입니까? –

10

android:configChanges="orientation"을 사용하는 솔루션은 API 레벨이 12 이하인 경우에만 작동합니다.

API 레벨 13 이상에서는 방향이 변경 될 때 화면 크기가 변경되므로 방향 변경시 활동이 여전히 파괴되고 시작됩니다. 나는 아래처럼

은 간단하게 "화면 크기"속성을 추가하여 변경 방향 (화면 사이즈 변경)의 활동 상태와의 onConfigurationChanged()를 유지

<activity> 
    android:name=".YourActivityName" 
    android:configChanges="orientation|screenSize"> 
</activity> 

이제이 호출됩니다. 이렇게하면 화면에있는 내용 (예 : 웹보기의 웹 페이지)이 그대로 유지됩니다.

이 사이트에서 이것을 배운 : 나를 위해 일한 것을

http://developer.android.com/guide/topics/resources/runtime-changes.html

+0

내가 필요한 것 :) 건배 – wayzz

+0

안녕하세요! 나는 'android : configChanges'를 사용할 수 없도록 초상화와 풍경 모드에 다른 레이아웃을 사용하고 있습니다. 다른 해결책이 있습니까? –

0

중 하나를 선언한다 : 또한 http://developer.android.com/guide/topics/manifest/activity-element.html

,이 나쁜 관행이 너무 런타임 변경 사항 처리에 대한 아래 링크를 읽어 분명히입니다 클래스 변수는 정적 변수입니다. 정적 클래스 변수는 응용 프로그램이로드 될 때 한 번 초기화되지만 응용 프로그램을 다시로드 할 때 다시 초기화되지는 않습니다.

이러한 변수는 다시 초기화하지 않으려는 상태 또는 개체를 보유 할 수 있습니다. 나는 이것이 우아하고 우아하지는 않지만 시험되고 나를 위해 일했다고 말할 수 없다.

관련 문제