คำถามติดแท็ก android-fragments

แฟรกเมนต์เป็นตัวแทนพฤติกรรมที่สามารถใช้ซ้ำได้หรือส่วนต่าง ๆ ของส่วนต่อประสานผู้ใช้ในแอพ Android

30
findViewById เป็นส่วน ๆ
ฉันพยายามสร้าง ImageView ใน Fragment ซึ่งจะอ้างถึงองค์ประกอบ ImageView ที่ฉันได้สร้างใน XML สำหรับ Fragment อย่างไรก็ตามfindViewByIdวิธีนี้ใช้ได้เฉพาะเมื่อฉันขยายคลาสกิจกรรม มีอะไรบ้างที่ฉันสามารถใช้ในแฟรกเมนต์ได้เช่นกัน? public class TestClass extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ImageView imageView = (ImageView)findViewById(R.id.my_image); return inflater.inflate(R.layout.testclassfragment, container, false); } } findViewByIdวิธีมีข้อผิดพลาดเกี่ยวกับมันซึ่งระบุว่าวิธีการที่จะไม่ได้กำหนด

30
onActivityResult ไม่ได้ถูกเรียกเป็นแฟรกเมนต์
กิจกรรมที่โฮสต์แฟรกเมนต์นี้ได้ถูกonActivityResultเรียกเมื่อกิจกรรมกล้องกลับมา ส่วนของฉันเริ่มกิจกรรมเพื่อให้ได้ผลลัพธ์โดยมีเจตนาส่งให้กล้องถ่ายรูป แอปพลิเคชั่นรูปภาพโหลดได้ดีถ่ายภาพและส่งคืน onActivityResultแต่ก็ไม่เคยตี ฉันได้ตั้งจุดพัก แต่ไม่มีอะไรถูกกระตุ้น ส่วนได้onActivityResultหรือไม่ ฉันคิดอย่างนั้นเพราะมันเป็นฟังก์ชั่นที่มีให้ ทำไมสิ่งนี้ถึงไม่ถูกเรียก? ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image); myImage.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, 1888); } }); @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if( requestCode == 1888 ) { Bitmap photo = …

14
Dilemma: เมื่อใดควรใช้ Fragments vs Activities:
ฉันรู้แล้ว Activitiesได้รับการออกแบบมาเพื่อแสดงหน้าจอเดียวของแอปพลิเคชันของฉันในขณะที่Fragmentsได้รับการออกแบบให้เป็นรูปแบบ UI ที่ใช้ซ้ำได้โดยมีตรรกะฝังอยู่ภายใน เมื่อไม่นานมานี้ฉันได้พัฒนาแอปพลิเคชั่นตามที่กล่าวไว้ว่าพวกเขาควรได้รับการพัฒนา ฉันสร้างActivityเพื่อเป็นตัวแทนของหน้าจอของแอพลิเคชันและเศษมือของฉันหรือViewPager Google Mapsฉันไม่ค่อยสร้างListFragment UI หรืออื่น ๆ ที่สามารถนำมาใช้ซ้ำได้หลายครั้ง เร็ว ๆ นี้ผมสะดุดในโครงการที่มีเพียง 2 Activitiesหนึ่งเป็นและอีกหนึ่งคือSettingsActivity MainActivityเลย์เอาต์ของMainActivityบรรจุด้วยแฟรกเมนต์ UI แบบเต็มหน้าจอที่ซ่อนอยู่จำนวนมากและแสดงเพียงหนึ่งอันเท่านั้น ในActivityตรรกะมีหลายFragmentTransitionsหน้าจอที่แตกต่างกันของแอปพลิเคชัน สิ่งที่ฉันชอบเกี่ยวกับวิธีการนี้คือเนื่องจากแอปพลิเคชันใช้ActionBarมันมันยังคงอยู่และไม่ย้ายไปอยู่กับภาพเคลื่อนไหวการสลับหน้าจอซึ่งเป็นสิ่งที่เกิดขึ้นกับการActivityสลับ สิ่งนี้ให้ความรู้สึกที่คล่องแคล่วยิ่งขึ้นสำหรับการเปลี่ยนหน้าจอ ดังนั้นฉันเดาว่าสิ่งที่ฉันขอคือการแบ่งปันลักษณะการพัฒนาในปัจจุบันของคุณเกี่ยวกับหัวข้อนี้ฉันรู้ว่ามันอาจดูเหมือนคำถามตามความเห็นในตอนแรก แต่ฉันมองว่ามันเป็นคำถามที่เกี่ยวกับการออกแบบและสถาปัตยกรรมของ Android ... ตามความเห็นอย่างหนึ่ง UPDATE (01.05.2014): ทำตามการนำเสนอนี้โดยEric BurkeจากSquare (ซึ่งฉันต้องบอกว่าเป็นการนำเสนอที่ยอดเยี่ยมพร้อมเครื่องมือที่มีประโยชน์มากมายสำหรับนักพัฒนา Android และฉันไม่เกี่ยวข้องกับ Square) http://www.infoq.com/presentations/Android-Design/ จากประสบการณ์ส่วนตัวของฉันในช่วงไม่กี่เดือนที่ผ่านมาผมพบว่าวิธีที่ดีที่สุดในการสร้างการใช้งานของฉันคือการสร้างกลุ่มของชิ้นส่วนที่มาเป็นตัวแทนของการไหลActivityในการประยุกต์และนำเสนอชิ้นส่วนเหล่านั้นทั้งหมดในหนึ่ง ดังนั้นโดยทั่วไปคุณจะมีจำนวนActivitiesใบสมัครของคุณเท่ากับจำนวนการไหล ด้วยวิธีนี้แถบแอ็คชั่นยังคงเหมือนเดิมบนหน้าจอทั้งหมดของโฟลว์ ในขณะที่ Eric Burke กล่าวและฉันก็ตระหนักเช่นกันปรัชญาของการใช้น้อยActivitiesที่สุดไม่สามารถใช้ได้กับทุกสถานการณ์เพราะมันสร้างความสับสนในสิ่งที่เขาเรียกว่ากิจกรรม "พระเจ้า"

23
วิธีการตรวจสอบว่าเมื่อใดที่ Fragment มองเห็นได้ใน ViewPager
ปัญหา: มีการยิงชิ้นส่วนonResume()ในViewPagerก่อนที่จะเห็นชิ้นส่วนจริง ตัวอย่างเช่นฉันมี 2 ชิ้นส่วนด้วยและViewPager FragmentPagerAdapterส่วนที่สองมีให้เฉพาะสำหรับผู้ใช้ที่ได้รับอนุญาตและฉันต้องขอให้ผู้ใช้เข้าสู่ระบบเมื่อส่วนที่มองเห็นได้ (ใช้กล่องโต้ตอบการแจ้งเตือน) แต่ViewPagerชิ้นส่วนที่สองจะสร้างขึ้นเมื่อมองเห็นชิ้นแรกเพื่อแคชชิ้นส่วนที่สองและทำให้สามารถมองเห็นได้เมื่อผู้ใช้เริ่มตบ ดังนั้นonResume()เหตุการณ์จึงถูกยิงในส่วนที่สองนานก่อนที่จะปรากฏให้เห็น นั่นเป็นเหตุผลที่ฉันพยายามค้นหาเหตุการณ์ที่ไฟไหม้เมื่อส่วนที่สองปรากฏให้เห็นเพื่อแสดงการสนทนาในช่วงเวลาที่เหมาะสม สิ่งนี้สามารถทำได้?

13
แนวทางปฏิบัติที่ดีที่สุดสำหรับการสร้างอินสแตนซ์ Android ใหม่
ฉันได้เห็นวิธีปฏิบัติทั่วไปสองประการเพื่อยกตัวอย่างชิ้นส่วนใหม่ในแอปพลิเคชัน: Fragment newFragment = new MyFragment(); และ Fragment newFragment = MyFragment.newInstance(); ตัวเลือกที่สองใช้ประโยชน์จากวิธีการคงที่newInstance()และโดยทั่วไปมีวิธีการดังต่อไปนี้ public static Fragment newInstance() { MyFragment myFragment = new MyFragment(); return myFragment; } ตอนแรกฉันคิดว่าประโยชน์หลักคือความจริงที่ว่าฉันสามารถโอเวอร์โหลดเมธอด newInstance () เพื่อให้ความยืดหยุ่นเมื่อสร้างอินสแตนซ์ใหม่ของ Fragment - แต่ฉันสามารถทำได้โดยการสร้าง Constructor ที่โอเวอร์โหลดสำหรับ Fragment ฉันพลาดอะไรไปหรือเปล่า? ประโยชน์ของวิธีการหนึ่งเหนืออีกวิธีหนึ่งคืออะไร หรือเป็นเพียงการปฏิบัติที่ดี?

30
ใช้บริบทในส่วน
ฉันจะรับบริบทเป็นส่วนย่อยได้อย่างไร ฉันต้องใช้ฐานข้อมูลของฉันซึ่งคอนสตรัคเตอร์ใช้ในบริบท แต่getApplicationContext()และFragmentClass.thisไม่ทำงานฉันต้องทำอย่างไร ตัวสร้างฐานข้อมูล public Database(Context ctx) { this.context = ctx; DBHelper = new DatabaseHelper(context); }

30
IllegalStateException: ไม่สามารถทำการกระทำนี้หลังจาก onSaveInstanceState ด้วย ViewPager
ฉันได้รับรายงานผู้ใช้จากแอพของฉันในตลาดโดยให้ข้อยกเว้นต่อไปนี้: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1109) at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:399) at android.app.Activity.onBackPressed(Activity.java:2066) at android.app.Activity.onKeyUp(Activity.java:2044) at android.view.KeyEvent.dispatch(KeyEvent.java:2529) at android.app.Activity.dispatchKeyEvent(Activity.java:2274) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1855) at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1277) at android.app.Activity.dispatchKeyEvent(Activity.java:2269) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112) at android.widget.TabHost.dispatchKeyEvent(TabHost.java:297) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112) at …

10
ViewPager และแฟรกเมนต์ - วิธีที่ถูกต้องในการจัดเก็บสถานะของแฟรกเมนต์คืออะไร
แฟรกเมนต์ดูเหมือนจะดีมากสำหรับการแยกตรรกะ UI ออกเป็นโมดูล แต่ตลอดViewPagerจนวงจรชีวิตของมันยังคงเป็นสิ่งที่ผิดสำหรับฉัน ดังนั้นความคิดของปราชญ์จึงเป็นสิ่งจำเป็นอย่างยิ่ง! แก้ไข ดูวิธีแก้ใบ้ด้านล่าง ;-) ขอบเขต กิจกรรมหลักมีViewPagerชิ้นส่วนด้วย แฟรกเมนต์เหล่านั้นสามารถใช้ตรรกะที่แตกต่างกันเล็กน้อยสำหรับกิจกรรมอื่น ๆ (ส่ง) ดังนั้นข้อมูลของแฟรกเมนต์จะถูกกรอกผ่านอินเตอร์เฟสการติดต่อกลับภายในกิจกรรม และทุกอย่างทำงานได้ดีในการเปิดตัวครั้งแรก แต่! ... ปัญหา เมื่อกิจกรรมถูกสร้างขึ้นใหม่ (เช่นการเปลี่ยนการวางแนว) ให้ทำViewPagerเศษของ รหัส (คุณจะพบด้านล่าง) บอกว่าทุกครั้งที่มีการสร้างกิจกรรมฉันพยายามที่จะสร้างViewPagerอะแดปเตอร์ชิ้นส่วนใหม่เช่นเดียวกับชิ้นส่วน (อาจเป็นปัญหา) แต่ FragmentManager ได้เก็บชิ้นส่วนเหล่านี้ไว้ที่ไหนซักแห่ง (ที่ไหน?) และ เริ่มกลไกการนันทนาการสำหรับผู้ที่ ดังนั้นกลไกการสันทนาการจึงเรียกส่วนของ "เก่า" ของ onAttach, onCreateView ฯลฯ ด้วยการติดต่อกลับของฉันสำหรับการเริ่มต้นข้อมูลผ่านวิธีการดำเนินการของกิจกรรม แต่วิธีนี้ชี้ไปที่ส่วนที่สร้างขึ้นใหม่ซึ่งสร้างขึ้นผ่านวิธีการ onCreate ของกิจกรรม ปัญหา บางทีฉันใช้รูปแบบที่ไม่ถูกต้อง แต่แม้กระทั่งหนังสือ Android 3 Pro ก็ไม่ได้มีอะไรมาก ได้โปรดให้หมัดหนึ่ง - …

6
วิธีการบันทึกสถานะของชิ้นส่วนอินสแตนซ์ในสแต็กหลังอย่างถูกต้อง
ฉันพบคำถามที่คล้ายกันจำนวนมากใน SO แต่ไม่มีคำตอบที่ตรงกับความต้องการของฉัน ฉันมีเลย์เอาต์ที่แตกต่างกันสำหรับแนวตั้งและแนวนอนและฉันใช้แบ็คสแต็กซึ่งทั้งสองป้องกันไม่ให้ฉันใช้setRetainState()และลูกเล่นโดยใช้รูทีนการเปลี่ยนแปลงการกำหนดค่า ฉันแสดงข้อมูลบางอย่างแก่ผู้ใช้ใน TextViews ซึ่งไม่ได้รับการบันทึกในตัวจัดการเริ่มต้น เมื่อเขียนแอปพลิเคชันของฉัน แต่เพียงผู้เดียวโดยใช้กิจกรรมสิ่งต่อไปนี้ใช้ได้ดี: TextView vstup; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.whatever); vstup = (TextView)findViewById(R.id.whatever); /* (...) */ } @Override public void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); state.putCharSequence(App.VSTUP, vstup.getText()); } @Override public void onRestoreInstanceState(Bundle state) { super.onRestoreInstanceState(state); vstup.setText(state.getCharSequence(App.VSTUP)); } ด้วยFragments สิ่งนี้ใช้ได้เฉพาะในสถานการณ์ที่เฉพาะเจาะจงเท่านั้น โดยเฉพาะสิ่งที่แตกอย่างน่ากลัวคือแทนที่ชิ้นส่วนวางไว้ในกองหลังแล้วหมุนหน้าจอในขณะที่ชิ้นส่วนใหม่จะปรากฏขึ้น จากสิ่งที่ฉันเข้าใจส่วนเก่าไม่ได้รับสายไปonSaveInstanceState()เมื่อถูกแทนที่ แต่การเข้าพักที่เชื่อมโยงอย่างใดไปActivityและวิธีการนี้เรียกว่าต่อมาเมื่อมันViewไม่ได้อยู่อีกต่อไปดังนั้นมองหาใด …

30
วิธีการใช้งาน onBackPressed () ในแฟรกเมนต์
มีวิธีที่เราสามารถนำไปใช้onBackPressed()ใน Android Fragment คล้ายกับวิธีที่เราใช้ใน Android Activity หรือไม่? onBackPressed()ในฐานะที่เป็นวงจรชีวิตส่วนไม่ได้ มีวิธีอื่นในการขี่มากกว่าonBackPressed()ใน Android 3.0 แฟรกเมนต์หรือไม่?

30
ฉันจะรับแฟรกเมนต์ที่แสดงอยู่ในปัจจุบันได้อย่างไร
ฉันกำลังเล่นกับชิ้นส่วนใน Android ฉันรู้ว่าฉันสามารถเปลี่ยนส่วนได้โดยใช้รหัสต่อไปนี้: FragmentManager fragMgr = getSupportFragmentManager(); FragmentTransaction fragTrans = fragMgr.beginTransaction(); MyFragment myFragment = new MyFragment(); //my custom fragment fragTrans.replace(android.R.id.content, myFragment); fragTrans.addToBackStack(null); fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); fragTrans.commit(); คำถามของฉันคือในไฟล์ Java ฉันจะรับอินสแตนซ์ Fragment ที่แสดงอยู่ในปัจจุบันได้อย่างไร

18
วิธีจัดการกับการคลิกปุ่มโดยใช้ XML onClick ภายใน Fragments
Pre-Honeycomb (Android 3) แต่ละกิจกรรมได้รับการลงทะเบียนเพื่อจัดการการคลิกปุ่มผ่านonClickแท็กใน XML ของเค้าโครง: android:onClick="myClickMethod" ภายในเมธอดนั้นคุณสามารถใช้view.getId()และคำสั่ง switch เพื่อทำตรรกะปุ่ม ด้วยการแนะนำ Honeycomb ฉันได้แบ่งกิจกรรมเหล่านี้เป็นชิ้นส่วนซึ่งสามารถนำกลับมาใช้ใหม่ได้ในกิจกรรมต่างๆ พฤติกรรมส่วนใหญ่ของปุ่มนั้นเป็นอิสระจากกิจกรรมและฉันต้องการให้โค้ดอยู่ในไฟล์ Fragments โดยไม่ต้องใช้วิธีเก่า (ก่อน 1.6) ในการลงทะเบียนOnClickListenerสำหรับแต่ละปุ่ม final Button button = (Button) findViewById(R.id.button_id); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Perform action on click } }); ปัญหาคือเมื่อรูปแบบของฉันพองตัวมันยังคงเป็นพื้นที่กิจกรรมที่ได้รับการคลิกปุ่มไม่ใช่ชิ้นส่วนแต่ละชิ้น มีวิธีการที่ดีทั้ง ลงทะเบียนชิ้นส่วนเพื่อรับการคลิกปุ่ม? ส่งเหตุการณ์คลิกจากกิจกรรมไปยังส่วนที่เป็นของพวกเขาหรือไม่

19
วิธีเพิ่มเมนูตัวเลือกในแฟรกเมนต์ใน Android
ฉันกำลังพยายามเพิ่มรายการในเมนูตัวเลือกจากกลุ่มของชิ้นส่วน ฉันได้สร้างMenuFragmentคลาสใหม่และขยายสิ่งนี้สำหรับแฟรกเมนต์ที่ฉันต้องการรวมรายการเมนูค่ะนี่คือรหัส: Java: public class MenuFragment extends Fragment { MenuItem fav; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { fav = menu.add("add"); fav.setIcon(R.drawable.btn_star_big_off); } } Kotlin: class MenuFragment : Fragment { lateinit var fav: MenuItem override fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) setHasOptionsMenu(true) …

11
แฟรกเมนต์ MyFragment ไม่ได้แนบกับกิจกรรม
ฉันได้สร้างแอปทดสอบขนาดเล็กซึ่งแสดงถึงปัญหาของฉัน ฉันใช้ ActionBarSherlock เพื่อใช้แท็บที่มี (Sherlock) แฟรกเมนต์ รหัสของฉัน: TestActivity.java public class TestActivity extends SherlockFragmentActivity { private ActionBar actionBar; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupTabs(savedInstanceState); } private void setupTabs(Bundle savedInstanceState) { actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); addTab1(); addTab2(); } private void addTab1() { Tab tab1 = actionBar.newTab(); tab1.setTag("1"); String tabText = …

7
FragmentPagerAdapter และ FragmentStatePagerAdapter แตกต่างกันอย่างไร
ความแตกต่างระหว่างFragmentPagerAdapterและFragmentStatePagerAdapterคืออะไร? เกี่ยวกับFragmentPagerAdapterคำแนะนำของ Google พูดว่า: เพจเจอร์รุ่นนี้เหมาะที่สุดสำหรับการใช้งานเมื่อมีชิ้นส่วนแบบสแตติกจำนวนหนึ่งที่จะถูกเพจผ่านเช่นกลุ่มแท็บ แฟรกเมนต์ของแต่ละหน้าที่ผู้ใช้เยี่ยมชมจะถูกเก็บไว้ในหน่วยความจำแม้ว่าลำดับชั้นการดูอาจถูกทำลายเมื่อมองไม่เห็น สิ่งนี้สามารถส่งผลในการใช้หน่วยความจำจำนวนมากเนื่องจากอินสแตนซ์ของแฟรกเมนต์สามารถคงอยู่ในสถานะที่กำหนดเองได้ FragmentStatePagerAdapterสำหรับชุดขนาดใหญ่ของหน้าพิจารณา และเกี่ยวกับFragmentStatePagerAdapter: เพจเจอร์รุ่นนี้มีประโยชน์มากกว่าเมื่อมีเพจจำนวนมากทำงานได้คล้ายกับมุมมองรายการ เมื่อผู้ใช้ไม่สามารถมองเห็นหน้าส่วนของพวกเขาทั้งหมดอาจถูกทำลายเพียงรักษาสถานะที่บันทึกของส่วนที่ สิ่งนี้ทำให้เพจเจอร์เก็บหน่วยความจำน้อยลงที่เกี่ยวข้องกับเพจที่เยี่ยมชมแต่ละเพจเมื่อเปรียบเทียบกับ FragmentPagerAdapterค่าใช้จ่ายที่อาจมีค่าใช้จ่ายมากกว่าเมื่อสลับระหว่างเพจ ดังนั้นฉันมีเพียง 3 ชิ้น แต่ทั้งหมดเป็นโมดูลแยกต่างหากที่มีข้อมูลจำนวนมาก Fragment1จัดการข้อมูลบางส่วน (ซึ่งผู้ใช้ป้อน) และผ่านทางกิจกรรมเข้าซึ่งเป็นเพียงง่ายๆFragment2 นอกจากนี้ยังมีListFragmentFragment3ListFragment ดังนั้นคำถามของฉันคือ : ฉันควรใช้อะแดปเตอร์ใด FragmentPagerAdapterหรือFragmentStatePagerAdapter?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.