【问题标题】:Problems with random fragment in androidandroid中随机片段的问题
【发布时间】:2018-09-30 06:21:32
【问题描述】:

我有一个应该显示随机片段的活动。

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import java.util.Random;
import android.support.v4.app.*;

public class RandomActivity extends FragmentActivity {

private Random1 random1;
private Random2 random2;
private Random3 random3;
private Random4 random4;
private Random5 random5;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_random);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    initUI();
}

private void initUI() {
    FragmentTransaction = getSupportFragmentManager().openTransaction();
    setRandomFragment();
}

private void setRandomFragment() {
    Random random = new Random();
    int randomFragmentNum = random.nextInt(250);
    if (randomFragmentNum < 50) {
        randomFragmentNum = 0;
    } else if (randomFragmentNum >= 50 && randomFragmentNum < 100) {
        randomFragmentNum = 1;
    } else if (randomFragmentNum >= 100 && randomFragmentNum < 150) {
        randomFragmentNum = 2;
    } else if (randomFragmentNum >= 150 && randomFragmentNum < 200) {
        randomFragmentNum = 3;
    } else if (randomFragmentNum >= 200 && randomFragmentNum <= 250) {
        randomFragmentNum = 4;
    }

    switch (randomFragmentNum) {
        case 0: {
            random1 = new Random1();
            FragmentTransaction.add(R.id.frag_rand_home, random1);
            FragmentTransaction.commit()
            break;
        }
        case 1: {
            random2 = new Random2();
            FragmentTransaction.add(R.id.frag_rand_home, random2);
            FragmentTransaction.commit()
            break;
        }
        case 2: {
            random3 = new Random3();
            FragmentTransaction.add(R.id.frag_rand_home, random3);
            FragmentTransaction.commit()
            break;
        }
        case 3: {
            random4 = new Random4();
            FragmentTransaction.add(R.id.frag_rand_home, random4);
            FragmentTransaction.commit()
            break;
        }
        case 4: {
            random5 = new Random5();
            FragmentTransaction.add(R.id.frag_rand_home, random5);
            FragmentTransaction.commit()
            break;
        }
    }
}
}

这是我的代码,但我仍然遇到一些错误:-(

这里的错误号 1:

private void initUI() {
    FragmentTransaction = getSupportFragmentManager().openTransaction();
    setRandomFragment();
}

表达式预期 | FragmentManager.openTransaction 只能从同一个库组 (groupId=com.android.support) 中调用。 此 API 已被标记为具有尚未满足的限制。 API 限制示例: * 方法只能由子类调用 * 方法只能从同一个库中访问(由 Gradle 库组 ID 定义)。* 方法只能从测试中访问。 .您可以使用 @RestrictTo 注释添加自己的 API 限制。

这里的错误编号为 2(在 case 0、1、2、3、4 上相同):

case 0: {
            random1 = new Random1();
            FragmentTransaction.add(R.id.frag_rand_home, random1);
            FragmentTransaction.commit()
            break;
        }

不能从静态上下文引用非静态方法“add(int, android.support.v4.app.Fragment)”。 |不能从静态上下文中引用非静态方法“commit()”。

几个小时以来我一直在处理这两个错误,但我仍然不知道如何修复它们。

如果有人能帮助我解决我的问题,那就太好了... 最好的祝福 杰里米

【问题讨论】:

  • 我建议你了解数组和List。当你开始用数字命名变量时,你应该看看其他可能的解决方案。使用数组,您可以将setRandomFragment() 减少为两行代码。
  • 你也应该只做int randomFragmentNum = random.nextInt(5); 然后你就不需要if...else 链。
  • FragmentTransaction = getSupportFragmentManager().openTransaction(); 这行没有意义。就像String = "hello";

标签: java android random fragment


【解决方案1】:

非常感谢您的关注和帮助!现在我能够为自己找到解决方案。我认为可以用更少的代码来做到这一点,但它确实有效!

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import java.util.Random;
import android.support.v4.app.*;
import android.support.v4.app.Fragment;

public class RandomActivity extends FragmentActivity {

private Random1 random1;
private Random2 random2;
private Random3 random3;
private Random4 random4;
private Random5 random5;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_random);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    FragmentTransaction fm = getSupportFragmentManager().beginTransaction();

    initUI();
}

private void initUI() {
    setRandomFragment();
}

private void setRandomFragment() {
    Random random = new Random();
    int randomFragmentNum = random.nextInt(250);
    if (randomFragmentNum < 50) {
        randomFragmentNum = 0;
    } else if (randomFragmentNum >= 50 && randomFragmentNum < 100) {
        randomFragmentNum = 1;
    } else if (randomFragmentNum >= 100 && randomFragmentNum < 150) {
        randomFragmentNum = 2;
    } else if (randomFragmentNum >= 150 && randomFragmentNum < 200) {
        randomFragmentNum = 3;
    } else if (randomFragmentNum >= 200 && randomFragmentNum <= 250) {
        randomFragmentNum = 4;
    }

    switch (randomFragmentNum) {
        case 0: {
            random1 = new Random1();
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.frag_rand_home, random1, "Home");
            fragmentTransaction.commit();
            break;
        }
        case 1: {
            random2 = new Random2();
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.frag_rand_home, random2, "Home");
            fragmentTransaction.commit();
            break;
        }
        case 2: {
            random3 = new Random3();
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.frag_rand_home, random3, "Home");
            fragmentTransaction.commit();
            break;
        }
        case 3: {
            random4 = new Random4();
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.frag_rand_home, random4, "Home");
            fragmentTransaction.commit();
            break;
        }
        case 4: {
            random5 = new Random5();
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.frag_rand_home, random5, "Home");
            fragmentTransaction.commit();
            break;
        }
    }
}
}

【讨论】:

    【解决方案2】:

    您需要创建一个实例 arrable 而不是将其与 class as 一起使用

    FragmentTransaction fm = getSupportFragmentManager().beginTransaction();
    

    因为你想在其他方法中使用它所以

    private FragmentTransaction fm;
    private void initUI() {
        FragmentTransaction fm = getSupportFragmentManager().beginTransaction();
        setRandomFragment();
    }
    

    稍后

    case 0: {
            random1 = new Random1();
            fm(R.id.frag_rand_home, random1);
            fm()
            break;
        }
    

    注意:openTransaction() 应该是 beginTransaction() 并且您必须在加载另一个片段之前获取一个新的事务实例,并且还可以使用replace 第二次及以后更改片段

    FragmentManager.openTransaction 只能从内部调用 同一个库组(groupId=com.android.support)

    从source code 开始,opentransaction 已被弃用,因此不再使用,甚至在文档中也没有,但在内部它确实调用了beginTranscation,并且它还与@hide 注释一起应用,所以看起来你是使用一些旧的 android 平台来构建您的应用程序

    参考:

    What exactly does Android's @hide annotation do?

    Difference between add(), replace(), and addToBackStack()

    【讨论】:

    • 还有FragmentManager.openTransaction只能在同一个库组内调用(groupId=com.android.support)...
    • @JeremyBrehe 我找不到openTransaction 的文档,所以我不知道它是什么
    • 从source code 到opentransaction 已被弃用,因此不再使用,甚至在文档中也没有,但在内部它确实调用beginTranscation,并且它也与@hide 注释一起应用所以看起来你正在使用一些旧的 android 平台来构建你的应用程序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多