如何按字符串名称打开片段?

时间:2014-11-25 22:06:35

标签: android android-fragments

我想打开一个随机片段。现在我打开它生成一个随机数和一个开关,case 1,case2等,我打开片段1,2等。这些片段是级别,它们的名字是:Nivel1,Nivel2等。

但是如果我使用这种方法,我想要做超过100个级别并且它有很多代码。有没有办法生成随机数,然后如果数字是2显示Nivel2()片段等?

这是我的实际代码:

public class Xtreme extends Activity {
String SiguienteNivel;
static int randomFragmentNum;
static int NivelesTotales=30;
static Random random = new Random();
FragmentManager fragmentManager = getFragmentManager();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_xtreme);
    randomFragmentNum = random.nextInt(7);
    Fragment();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.xtreme, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

public void Fragment() {
    switch (randomFragmentNum) {
        case 0: {
            fragmentManager.beginTransaction().replace(R.id.container, new Nivel1()).commit();
            break;
        }
        case 1: {
            fragmentManager.beginTransaction().replace(R.id.container, new Nivel2()).commit();
            break;
        }
        case 2: {
            fragmentManager.beginTransaction().replace(R.id.container, new Nivel3()).commit();
            break;
        }
        case 3: {
            fragmentManager.beginTransaction().replace(R.id.container, new Nivel4()).commit();
            break;
        }
        case 4: {
            fragmentManager.beginTransaction().replace(R.id.container, new Nivel5()).commit();
            break;
        }
        case 5: {
            fragmentManager.beginTransaction().replace(R.id.container, new Nivel6()).commit();
            break;
        }
        case 6: {
            fragmentManager.beginTransaction().replace(R.id.container, new Nivel7()).commit();
            break;
        }
        case 7: {
            fragmentManager.beginTransaction().replace(R.id.container, new Nivel8()).commit();
            break;
        }
    }
}
}

2 个答案:

答案 0 :(得分:5)

您可以按名称创建一个类:

try{
    Fragment f = (Fragment)(Class.forName("com.example.Fragment"+i).newInstance());
    fragmentManager.beginTransaction().replace(R.id.container,f).commit();
}catch(ClassNotFoundException e){
    Log.e("loading level","level class not found",e);
}

答案 1 :(得分:1)

Zielony的回答有助于解决这一特定问题,但作为我想补充的建议。我不知道如何为每个级别创建片段类文件是一个很好的方法。如果你想创造100多个级别,甚至更多。寻找一种让关卡变得动态的方法。如果你不能,你真的确定你会想要创造100个级别的工作吗?或者至少做xml布局,看看所有级别是否都有相同的游戏玩法。如果是这样,那么您可以随机执行,获取关卡布局名称并将其传递给片段,以便使用新布局重新创建它。