【问题标题】:Calling getSupportFragmentManager().getFragments().get(1) gives error Invalid index 1, size is 1调用 getSupportFragmentManager().getFragments().get(1) 给出错误 Invalid index 1, size is 1
【发布时间】:2016-05-18 00:43:27
【问题描述】:

在两种不同的情况下,我将变量从 MainActivity 传递到 HomeFragment,如下所示:

首先我在MainActivity中调用这个方法:

buttonCreator(d, Name);

然后我将变量“d”和“Name”发送到 HomeFragment,如下所示:

public void buttonCreator(Drawable d,String a) {
    int fragsize = getSupportFragmentManager().getFragments().size();
    Log.d("tag_name", "Size of Home Fragment" + fragsize);
    HomeFragment homeFragment = (HomeFragment)getSupportFragmentManager().getFragments().get(1);
    homeFragment.createButton(d, a);
}

我第一次调用 buttonCreator(d,Name) 时没有收到任何错误。 我第二次尝试通过 buttonCreator 将变量传递给 HomeFragment 时,出现错误“IndexOutOfBoundsException: Invalid index 1, size is 1”。 我认为这与 HomeFragment 的数组大小有关,但我在这里并不完全理解片段和数组之间的联系。

我知道我第一次尝试访问 HomeFragment 时会调用:

int fragsize = getSupportFragmentManager().getFragments().size();

我得到“3”的输出,第二次调用它(当它崩溃时),我得到“1”的输出。 谁能解释一下为什么会发生这种情况以及我可以如何解决这个问题?

如果有帮助,这是我的完整 MainActivity。我第一次调用 buttonCreator 是在“RepeaterTask”中,第二次(当它崩溃时)是通过 onCreate(),通过“else”语句。

public class MainActivity extends FragmentActivity implements HomeFragment.ButtonCreator {


private Thread repeatTaskThread;
private byte[] byteArray;
private static Context mContext;
private Cursor c;

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

   mContext = getApplicationContext();

   DatabaseStructure database = new DatabaseStructure(mContext);
   database.checkDatabase();


   // if database is empty (checkDatabase == false) Open empty HomeFragment
   if (!database.checkDatabase()) {

       Log.d("tag_name", "Database is Empty: Open HomeFragment");

       FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
       ft.replace(R.id.container, new HomeFragment(),"Home_Fragment")
               .addToBackStack("Home_Fragment").commit();
   }

   else {

       DatabaseStructure appDatabase = new DatabaseStructure(this);
       c = appDatabase.getApps();
       c.moveToFirst();

       String Name = c.getString(0);
       Log.d("tag_name", "String from Database" + appName);
       byte[] image = c.getBlob(1);
       Log.d("tag_name", "Image from Database" + image);


       Bitmap bitmap = BitmapFactory.decodeByteArray(image, 0, image.length);
       Drawable d = new BitmapDrawable(Resources.getSystem(), bitmap);
       Log.d("tag_name", "Drawable from Database" + d);

       buttonCreator(d, Name);
   }

   RepeatTask();

}


public void buttonCreator(Drawable d,String a) {
    int fragsize = getSupportFragmentManager().getFragments().size();
    Log.d("tag_name", "Size of Home Fragment" + fragsize);
    HomeFragment homeFragment = (HomeFragment)getSupportFragmentManager().getFragments().get(1);
    homeFragment.createButton(d, a);
}



public void RepeatTask() {

    repeatTaskThread = new Thread() {
        public void run() {

            while (true) {

                try {

                    Socket socket = new Socket("192.168.0.26", 5050);

                    // Get data sent through socket
                    DataInputStream DIS = new DataInputStream(socket.getInputStream());

                    System.out.println("DataInputStream Started");
                    final String Name = DIS.readUTF();
                    int len = DIS.readInt();
                    final byte[] data = new byte[len];

                    DIS.readFully(data, 0, data.length);

                    Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

                    final Drawable d = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap, 90, 90, true));


                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            buttonCreator(d, Name);

                            DatabaseStructure database = new DatabaseStructure(mContext);
                            database.addEntry(Name, data);

                        }
                    });


                    socket.close();

                } catch (Exception e) {

                    System.out.println("Exception is " + e.toString());
                }

                try {
                    // Sleep for 5 seconds
                    Thread.sleep(5000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        ;
    };
    repeatTaskThread.start();
}

}

【问题讨论】:

  • 当你想获取另一个片段时,一般不应该尝试在列表中找到它。如果您设置了一个,则按 id (stackoverflow.com/a/8545206/995891) 或标签 (stackoverflow.com/questions/16918854/…) 查找。
  • @zapl 当我这样做时:“HomeFragment hm = (HomeFragment)getSupportFragmentManager().findFragmentByTag("Home_Fragment"); Log.d("tag_name", "HomeFragment" + hm); hm. createButton(d,appName);"我得到 hm = null :( 试图解决这个问题。

标签: java android database image android-fragments


【解决方案1】:

数组和列表的索引从零开始(第一个索引是 0 而不是 1)所以试试

HomeFragment homeFragment = 
      (HomeFragment)getSupportFragmentManager().getFragments().get(0);

【讨论】:

  • 如果我这样做,我的应用程序会崩溃并出现错误“无法启动活动”
猜你喜欢
  • 2016-03-30
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
相关资源
最近更新 更多