ฉันกำลังพยายามตั้งค่าธีมสำหรับส่วนย่อย
การตั้งค่าธีมในรายการไม่ทำงาน:
android:theme="@android:style/Theme.Holo.Light"
จากการดูบล็อกก่อนหน้านี้ดูเหมือนว่าฉันต้องใช้ ContextThemeWrapper มีใครแนะนำตัวอย่างโค้ดให้ฉันได้ไหม ฉันไม่พบอะไรเลย
ฉันกำลังพยายามตั้งค่าธีมสำหรับส่วนย่อย
การตั้งค่าธีมในรายการไม่ทำงาน:
android:theme="@android:style/Theme.Holo.Light"
จากการดูบล็อกก่อนหน้านี้ดูเหมือนว่าฉันต้องใช้ ContextThemeWrapper มีใครแนะนำตัวอย่างโค้ดให้ฉันได้ไหม ฉันไม่พบอะไรเลย
คำตอบ:
โดยปกติการตั้งค่า Theme ในไฟล์ Manifest จะใช้สำหรับกิจกรรม
หากคุณต้องการตั้งค่า Theme สำหรับ Fragment ให้เพิ่มโค้ดถัดไปใน onCreateView () ของ Fragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// create ContextThemeWrapper from the original Activity Context with the custom theme
final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.yourCustomTheme);
// clone the inflater using the ContextThemeWrapper
LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper);
// inflate the layout using the cloned inflater, not default inflater
return localInflater.inflate(R.layout.yourLayout, container, false);
}
Fragment นำธีมมาจากกิจกรรม แต่ละส่วนได้รับการกำหนดธีมของกิจกรรมที่มีอยู่
ธีมถูกนำไปใช้ในเมธอด Fragment.onCreateView โดยที่โค้ดของคุณสร้างมุมมองซึ่งเป็นอ็อบเจ็กต์ที่ใช้ธีม
ใน Fragment.onCreateView คุณจะได้รับพารามิเตอร์ LayoutInflater ซึ่งจะขยายมุมมองและมี Context ที่ใช้สำหรับธีมจริงๆแล้วนี่คือกิจกรรม การดูที่สูงเกินจริงของคุณจึงใช้ธีมของกิจกรรม
ในการลบล้างธีมคุณสามารถเรียกLayoutInflater.cloneInContextซึ่งกล่าวถึงในเอกสารว่าอาจใช้สำหรับการเปลี่ยนธีม คุณสามารถใช้ ContextThemeWrapper ได้ที่นี่ จากนั้นใช้เครื่องเป่าลมแบบโคลนเพื่อสร้างมุมมองของชิ้นส่วน
สำหรับการใช้สไตล์เดียวฉันใช้เพียง
getContext().getTheme().applyStyle(styleId, true);
ในonCreateView()
ส่วนก่อนที่จะขยายมุมมองรูทของส่วนและมันก็ใช้ได้สำหรับฉัน
getContext()
ฉันยังพยายามทำให้ไดอะล็อกแฟรกเมนต์ของฉันแสดงด้วยธีมที่แตกต่างกันสำหรับกิจกรรมของมันและทำตามวิธีแก้ปัญหานี้ เช่นเดียวกับบางคนที่กล่าวถึงในความคิดเห็นฉันไม่สามารถใช้งานได้และกล่องโต้ตอบยังคงแสดงตามธีมที่ระบุในไฟล์ Manifest ปัญหาที่เกิดขึ้นจะกลายเป็นว่าผมสร้างโต้ตอบโดยใช้AlertDialog.Builder
ในonCreateDialog
วิธีการและอื่น ๆ ก็ไม่ได้ทำให้การใช้onCreateView
วิธีการตามที่ปรากฏในคำตอบที่ผมเชื่อมโยงกับ และเมื่อฉันสร้างอินสแตนซ์AlertDialog.Builder
ฉันกำลังส่งในบริบทโดยใช้getActivity()
เมื่อฉันควรใช้อินสแตนซ์ConstextThemeWrapper
แทน
นี่คือรหัสสำหรับ onCreateDialog ของฉัน:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Create ContextThemeWrapper from the original Activity Context
ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(getActivity(), android.R.style.Theme_DeviceDefault_Light_Dialog);
LayoutInflater inflater = getActivity().getLayoutInflater().cloneInContext(contextThemeWrapper);
// Now take note of the parameter passed into AlertDialog.Builder constructor
AlertDialog.Builder builder = new AlertDialog.Builder(contextThemeWrapper);
View view = inflater.inflate(R.layout.set_server_dialog, null);
mEditText = (EditText) view.findViewById(R.id.txt_server);
mEditText.requestFocus(); // Show soft keyboard automatically
mEditText.setOnEditorActionListener(this);
builder.setView(view);
builder.setTitle(R.string.server_dialog);
builder.setPositiveButton(android.R.string.ok, this);
Dialog dialog = builder.create();
dialog.setCanceledOnTouchOutside(false);
return dialog;
}
เดิมฉันมีAlertDialog.Builder
การสร้างอินสแตนซ์ดังนี้:
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
ซึ่งฉันเปลี่ยนเป็น:
AlertDialog.Builder builder = new AlertDialog.Builder(contextThemeWrapper);
หลังจากการเปลี่ยนแปลงนี้กล่องโต้ตอบแฟรกเมนต์จะแสดงด้วยธีมที่ถูกต้อง ดังนั้นหากใครก็ตามกำลังมีปัญหาคล้ายกันและกำลังใช้งานAlertDialog.Builder
จากนั้นให้ตรวจสอบบริบทที่ส่งผ่านไปยังตัวสร้าง หวังว่านี่จะช่วยได้! :)
ตรวจสอบให้แน่ใจว่าคุณได้android:minSdkVersion="11"
ตั้งค่าไว้ในรายการของคุณ นี่อาจเป็นสาเหตุว่าทำไมเดวิดตัวอย่างไม่เหมาะกับคุณ
ตั้งค่าandroid:theme="@android:style/Theme.Holo.Light"
แอตทริบิวต์สำหรับ<application>
แท็กไม่ใช่ไฟล์<activity>
แท็ก
ปัญหาที่เป็นไปได้อีกประการหนึ่งอาจเป็นวิธีที่คุณได้รับบริบทเมื่อใช้ไฟล์ContextThemeWrapper()
. หากคุณใช้บางอย่างเช่นgetActivity().getApplicationContext()
เพียงแค่แทนที่ด้วยgetActivity()
แทน
โดยปกติ Theme.Holo ควรใช้กับ Fragments ที่เชื่อมโยงกับ MainActivity
โปรดทราบว่าคุณใช้ ContextThemeWrapper เมื่อคุณต้องการที่จะใช้ที่แตกต่างกันธีมสำหรับส่วนของคุณ อาจช่วยได้หากคุณให้ชิ้นส่วนของโค้ดจาก MainActivity ซึ่งคุณเพิ่ม Fragments ของคุณ
ลิงค์ที่มีประโยชน์:
ฉันลองวิธีแก้ปัญหาที่ David แนะนำว่ามันใช้งานได้ แต่ไม่ใช่ในทุกสถานการณ์:
1. สำหรับส่วนแรกที่เพิ่มลงในสแต็กนั้นมีธีมของกิจกรรมไม่ใช่ธีมที่กำหนดไว้ใน onCrateView แต่ในส่วนที่สองที่ฉัน เพิ่มลงในสแต็กแก้ไขให้ถูกต้องใช้กับชิ้นส่วน
2. ในส่วนที่สองที่แสดงอย่างถูกต้องฉันได้ทำสิ่งต่อไปนี้ฉันบังคับให้ปิดแอปโดยการล้างหน่วยความจำเปิดแอปอีกครั้งและเมื่อกิจกรรมถูกสร้างขึ้นใหม่ด้วยส่วนที่แยกส่วนนั้นเปลี่ยนสิ่งที่ผิดไปจาก กิจกรรมและไม่เหมือนกันที่ตั้งค่าไว้ใน onCrateView ของแฟรกเมนต์
เพื่อแก้ไขปัญหาฉันได้ทำการเปลี่ยนแปลงเล็กน้อยและแทนที่อาร์กิวเมนต์ container จาก inflater.inflate ด้วย null
ฉันไม่รู้วิธีที่ Inflater ใช้ในบางสถานการณ์บริบทจากมุมมองคอนเทนเนอร์
หมายเหตุ - ฉันใช้ android.support.v4.app.Fragment & android.support.v7.app.AppCompatActivity
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// create ContextThemeWrapper from the original Activity Context with the custom theme
final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.yourCustomTheme);
// clone the inflater using the ContextThemeWrapper
LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper);
// inflate the layout using the cloned inflater, not default inflater
return localInflater.inflate(R.layout.yourLayout, null, false);
}
ฉันรู้ว่ามันช้าไปหน่อย แต่มันอาจช่วยคนอื่นได้เพราะสิ่งนี้ช่วยฉันได้นอกจากนี้คุณยังสามารถลองเพิ่มบรรทัดของโค้ดด้านล่างภายในฟังก์ชัน onCreatView ของแฟรกเมนต์
inflater.context.setTheme(R.style.yourCustomTheme)
สร้างคลาส java จากนั้นใช้เค้าโครงที่คุณต้องการเปลี่ยนธีมในเมธอด onCreate จากนั้นพูดถึงมันในรายการตามปกติ
หากคุณต้องการใช้สไตล์สำหรับส่วนเฉพาะให้เพิ่มบรรทัดนี้ก่อนที่จะเรียกonCreateView()
หรือonAttach()
ส่วนย่อย
getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
getActivity().getWindow().setStatusBarColor(Color.TRANSPARENT);
และหากคุณต้องการที่จะตั้งแถบสถานะโปร่งใสจากนั้นตั้งค่าเป็นเท็จเพื่อfitsSystemWindows
ทรัพย์สินของรูปแบบรากของคุณ
android:fitsSystemWindows="false"
ฉันทำให้มันใช้งานได้โดยตั้งค่าธีมบนบริบทส่วนก่อนที่จะเรียกตัวเติมลม
หมายเหตุ: นี่เป็นตัวอย่างสำหรับ Xamarin Android ร่วมกับ MvvmCross ฉันไม่แน่ใจ 100% ว่าสิ่งนี้จะใช้ได้กับโปรแกรมเมอร์ Java หรือไม่ แต่คุณสามารถลอง :)
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
Context.SetTheme(Theme);
base.OnCreateView(inflater, container, savedInstanceState);
var view = this.BindingInflate(FragmentLayoutId, container, false);
// Doing some other stuff
return view;
}
รหัสวิธีการขยาย SetTheme
public static void SetTheme(this Context context, AppThemeStyle themeStyle)
{
var themeStyleResId = themeStyle == AppThemeStyle.Dark ? Resource.Style.AppTheme : Resource.Style.AppTheme_Light;
context.SetTheme(themeStyleResId);
}
ฉันหวังว่านี่จะช่วยบางคนได้ไชโย!
ฉันแก้ไขปัญหาโดยใช้android:theme = "@style/myTheme"
ในไฟล์เลย์เอาต์ของแฟรกเมนต์ ยกตัวอย่างเช่นการเปลี่ยนแปลงนี้รูปแบบของการLinearLayout
และเนื้อหามัน แต่ไม่สิ่งใด ๆ LinearLayout
ออกด้านข้าง ดังนั้นในการตกแต่งส่วนทั้งหมดด้วยสไตล์ใด ๆ ให้ใช้ธีมกับโครงร่างหลักส่วนใหญ่
หมายเหตุ: ในกรณีที่คุณยังไม่พบวิธีแก้ปัญหาคุณสามารถลองได้
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:theme = "@style/myTheme" >
<TextView
android:id="@+id/tc_buttom_text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Time elapsed"/>
<TextView
android:id="@+id/tc_buttom_text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="00:00:00 00"/>
</LinearLayout>
คุณสามารถลองใช้ lollipop ได้ใน onAttach
หน้าต่างสุดท้าย = activity.getWindow (); window.setStatusBarColor (myStatusBarColor)
และตั้งค่ากลับเป็นค่าเริ่มต้นใน ondettach