10

नवीनतम AppCompat-v21 लाइब्रेरी का उपयोग करके, मैंने बनाने और पॉप्युलेट करने के लिए ActionBarActivity का उपयोग किया। हालांकि, ActionBar अभिविन्यास या स्क्रीन आकार बदलते समय ऊंचाई और टेक्स्ट आकार को बदलना प्रतीत नहीं होता है। अन्य गतिविधियों पर भी इसका परीक्षण करना, यह व्यवहार केवल PreferenceActivity में हो रहा है (इस प्रश्न के विपरीत यहां पूछा गया: ActionBar capacity/overflow not changing on orientation change)।वरीयता फ्रेगमेंट में एक्शनबार, ऊंचाई और फ़ॉन्ट आकार का पुनर्मूल्यांकन नहीं करता

सबसे पहले, अभिविन्यास परिवर्तनों को संभालने के लिए, मैंने मैनिफेस्ट में android:configChanges="keyboard|keyboardHidden|orientation|screenSize" जोड़ा। मुझे संदेह है कि यह इस समस्या का मुख्य कारण है, लेकिन जैसा कि मैंने पहले उल्लेख किया था, यह अन्य Activity एस पर काम करता है।

पोर्ट्रेट मोड में शुरू PreferenceActivity:

यहाँ कुछ स्क्रीनशॉट कि इस मुद्दे को समझाने हैं

Portrait start

घुमाया गया पोर्ट्रेट से लैंडस्केप के लिए:

rotate to landscape

में PreferenceActivity शुरू लैंडस्केप मोड:

landscape

पोट्रेट पर घुमाया लैंडस्केप से:

import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 

public class PrefsActivity extends ActionBarActivity { 

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

     getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment()).commit(); 
    } 

} 
:

rotate to portrait

अतिरिक्त सूचना

यहाँ PreferenceActivity वर्ग है

क्या यह व्यवहार एक बग है? यदि नहीं, तो क्या कोई कामकाज या फिक्स है?


संपादित मैं

मैं नए ToolBar विजेट, लेकिन कोई भाग्य उपयोग करने की कोशिश।

import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.widget.Toolbar; 

public class PrefsActivity extends ActionBarActivity { 

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

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_pref); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     getFragmentManager().beginTransaction().replace(R.id.pref_frame, new PrefsFragment()).commit(); 
    } 

} 
+0

वही समस्या यहां। लेकिन मेरे मामले में फ़ॉन्ट आकार बस परिदृश्य में बहुत छोटा है, इससे कोई फर्क नहीं पड़ता कि यह कैसे शुरू किया गया है ... – Zordid

+0

क्या आपने शैलियों.एक्सएमएल में 'टेक्स्ट साइज' को परिभाषित करने का प्रयास किया है? कभी-कभी, जब आप निर्धारित मूल्य को परिभाषित नहीं करते हैं तो एंड्रॉइड को एक बग मिल जाएगी। आप इसे पढ़ सकते हैं: http://stackoverflow.com/q/16189877/3922207 और http://stackoverflow.com/a/12899367/3922207 –

उत्तर

3

android:configChanges अनुशंसित नहीं है क्योंकि अभिविन्यास, कीबोर्ड गतिविधि मनोरंजन का एकमात्र कारण नहीं है।

तो, बेहतर दृष्टिकोण इसे मैनिफेस्ट से निकालना है, और को Fragment कक्षा पर सेट करना है। यह गतिविधि को ताज़ा करते समय, टुकड़े के इस विनाशकारी और चक्र को बाईपास कर देगा।

चूंकि Toolbar गतिविधि में शामिल है और फ्रैगमेंट नहीं है, यह फ्रैगमेंट को रखते हुए टूलबार को रीफ्रेश करेगा।

संवाद के मामले में, Fragment Lifecycle का उपयोग उन्हें बंद/दोबारा करने के लिए काम करेगा।

स्रोत: http://developer.android.com/guide/topics/resources/runtime-changes.html

0

अन्य गतिविधियों आप भी साथ परीक्षण किया android:configChanges प्रकट पर घोषणा की है क्या?

जैसा कि आपने कहा, समस्या यह है कि

android:configChanges="keyboard|keyboardHidden|orientation|screenSize" 

रोटेशन हैंडल नहीं करता है। यह वास्तव में गतिविधि और विचारों को पुनर्निर्मित होने से रोकता है, जिससे विचार कॉन्फ़िगरेशन परिवर्तन के बाद संवाददाता मानों को नहीं पढ़ते हैं।

इस तथ्य को ध्यान में रखते हुए कि आप टुकड़े का उपयोग कर रहे हैं, मैं android:configChanges विशेषता को हटा दूंगा और PrefsFragment इसे इसके उदाहरण को बरकरार रखूंगा।

3

मैं इस समाधान की पेशकश कर सकते हैं।

लॉलीपॉप टूलबार और AppCompat टूलबार के साथ सिस्टम एक्शनबार के साथ काम करता है।

public static void fixActionBar(Activity activity, View toolbar) 
{ 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
    { 
     if (toolbar == null) 
     { 
      int id = activity.getResources().getIdentifier("action_bar", "id", "android"); 
      if (id != 0) toolbar = (Toolbar) activity.findViewById(id); 
     } 
     if (toolbar != null) 
     { 
      Context context = toolbar.getContext(); 
      TypedArray typedArray = context.obtainStyledAttributes(new int[] 
        {android.R.attr.actionBarStyle, android.R.attr.actionBarSize}); 
      int actionStyle = typedArray.getResourceId(0, 0); 
      int actionHeight = typedArray.getDimensionPixelSize(1, 0); 
      typedArray.recycle(); 
      try 
      { 
       View container = (View) toolbar.getParent(); 
       Field field = container.getClass().getDeclaredField("mHeight"); 
       field.setAccessible(true); 
       field.setInt(container, actionHeight); 
       View overlay = (View) container.getParent(); 
       field = overlay.getClass().getDeclaredField("mActionBarHeight"); 
       field.setAccessible(true); 
       field.setInt(overlay, actionHeight); 
      } 
      catch (Exception e) 
      { 

      } 
      toolbar.getLayoutParams().height = actionHeight; 
      toolbar.setMinimumHeight(actionHeight); 
      typedArray = context.obtainStyledAttributes(actionStyle, new int [] 
        {android.R.attr.titleTextStyle}); 
      ((Toolbar) toolbar).setTitleTextAppearance(context, typedArray.getResourceId(0, 0)); 
      typedArray.recycle(); 
     } 
    } 
} 

इस विधि को कॉन्फ़िगरेशन से कॉन्फ़िगरेशन से बदलें अपनी गतिविधि का परिवर्तन।

संबंधित मुद्दे