【问题标题】:How to open a random fragment in onCreate for activity?如何在 onCreate 中打开一个随机片段进行活动?
【发布时间】:2014-03-14 07:32:41
【问题描述】:

我想在启动 MainAcitivity 时在我的框架布局中打开一个随机片段。

问题:

  1. 如何将 random1 值转换为片段?
  2. 按下屏幕上的按钮时是否很难“刷新”视图以获取另一个随机片段?

    public class Beginner extends ActionBarActivity {
    
    private SoundPool spool;
    public int soundID_R1;
    public int soundID_R5;
    public int soundID_R8;
    
    private Fragment_gehorINTbeginnerR1 intBegFragment_R1;
    private Fragment_gehorINTbeginnerR5 intBegFragment_R5;
    private Fragment_gehorINTbeginnerR8 intBegFragment_R8;
    private int randomFragmentNum;
    private FrameLayout container;
    private FragmentTransaction fragmentTransaction;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_beginner);
    
        initUI();
    }
    
    private void initUI() {
        container = (FrameLayout) findViewById(R.id.beginner_frame);
        fragmentTransaction = getSupportFragmentManager().beginTransaction();
        setRandomFragment();
    }
    
    private void setRandomFragment() {
        Random random = new Random();
        randomFragmentNum = random.nextInt(2);
        //random choose fragment
        switch (randomFragmentNum) {
            case 0: {
                intBegFragment_R1 = new Fragment_gehorINTbeginnerR1();
                fragmentTransaction.replace(R.id.beginner_frame, intBegFragment_R1);
                fragmentTransaction.commit();
                break;
            }
            case 1: {
                intBegFragment_R5 = new Fragment_gehorINTbeginnerR5();
                fragmentTransaction.replace(R.id.beginner_frame, intBegFragment_R5);
                fragmentTransaction.commit();
                break;
            }
            case 2: {
                intBegFragment_R8 = new Fragment_gehorINTbeginnerR8();
                fragmentTransaction.replace(R.id.beginner_frame, intBegFragment_R8);
                fragmentTransaction.commit();
                break;
            }
        }
    }
    

【问题讨论】:

    标签: android random android-fragments android-activity


    【解决方案1】:

    这是一个例子:

       switch(random1.nextInt(3)){
            case 0:  setMyFragment(new Fragment_gehorINTbeginnerR1());
                     break;
            case 1: setMyFragment(new Fragment_gehorINTbeginnerR5());
                    break;
            case 2: setMyFragment(new Fragment_gehorINTbeginnerR8());
                    break;
        }
    

    我使用一种方法来加载我的片段:

     public void setMyFragment(Fragment fr){
        try{
            FragmentManager fm = getSupportFragmentManager();
            if(fr != null){
                FragmentTransaction ft = fm.beginTransaction();
                ft.replace(R.id.Mainfragment, fr, null);
                                ft.commitAllowingStateLoss();
            }
        }catch(IllegalStateException e) {           
            Log.e(TAG, "ISE setting main view "+e.getMessage());
        }       
    }
    

    【讨论】:

    • 开关中的 setMyFragment 给了我错误。我真的是编码新手,为什么会发生这种情况?
    【解决方案2】:

    简单的解决方案(更新 2)。如果使用 2 个随机片段,则必须在 random.getInt() 中设置值 100,如果三个片段 - 150,四个 - 200...并添加块 if-else 用于逻辑选择片段:

     /**
         * Created by scijoker on 2/14/14.
         */
        public class TestRandomFragmentActivity extends FragmentActivity {
            private LoginFragment loginFragment;
            private SignUpFragment signUpFragment;
            private FragmentTransaction fragmentTransaction;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.access_activity);
    
                initUI();
            }
    
            private void initUI() {
                fragmentTransaction = getSupportFragmentManager().openTransaction();
                setRandomFragment();
            }
    
            private void setRandomFragment() {
                Random random = new Random();
               int randomFragmentNum = random.nextInt(100);
            if (randomFragmentNum < 50) {
                randomFragmentNum = 0;
            } else{
                randomFragmentNum = 1;
            }
                //random choose fragment
                switch (randomFragmentNum) {
                    case 0: {
                        loginFragment = new LoginFragment();
                        fragmentTransaction.add(R.id.fl_container, loginFragment);
                        fragmentTransaction.commit()
                        break;
                    }
                    case 1: {
                        signUpFragment = new SignUpFragment();
                        fragmentTransaction.add(R.id.fl_container, signUpFragment);
                        fragmentTransaction.commit()
                        break;
                    }
                }
            }
    

    【讨论】:

    • 我无法让它工作,因为我的类扩展了 ActionBarAcitivity,而不是 FragmentActivity。
    • 为了在你的活动中使用片段,你的类必须扩展 FragmentActivity
    • 如果您使用的是 v7 appcompat 库,则您的 Activity 应改为扩展 ActionBarActivity,它是 FragmentActivity 的子类(有关更多信息,请阅读添加操作栏)。 (来自 Android 开发者网站)developer.android.com/training/basics/fragments/creating.html
    • 没有更多错误...但我总是加载片段#1(在我的代码中命名为 R1)。你能找到问题吗?
    • 你在 random.nextInt(1) 中设置了什么数值?
    【解决方案3】:

    问题是随机的:在三个片段之间进行随机选择的参数非常小。这段代码可以帮助你。请插入 setRandomFragment():

    randomFragmentNum = random.nextInt(150);
            if (randomFragmentNum < 50) {
                randomFragmentNum = 0;
            } else if (randomFragmentNum < 100) {
                randomFragmentNum = 1;
            } else randomFragmentNum = 2;
    

    更新 2: 对于五个片段

    randomFragmentNum = random.nextInt(250);
                if (randomFragmentNum < 50) {
                    randomFragmentNum = 0;
                } else if (randomFragmentNum < 100) {
                    randomFragmentNum = 1;
                } else if (randomFragmentNum < 150) {
                    randomFragmentNum = 2;
                } else if (randomFragmentNum < 200) {
                    randomFragmentNum = 3;
                } else 
                    randomFragmentNum = 4;
                } 
    

    【讨论】:

    • 我希望对您有所帮助 向您致以最诚挚的问候,Andrew Prayzner
    • 非常感谢!它完全按照我的意愿工作! :D
    • 嗯...我不明白如何为更多片段制作此代码,例如 5?
    • 有什么问题?)你有随机选择片段的算法
    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    相关资源
    最近更新 更多