Заполнить второй список в новом Aсtivity

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
huligan
Сообщения: 19
Зарегистрирован: 11 окт 2013, 12:28

Заполнить второй список в новом Aсtivity

Сообщение huligan » 11 окт 2013, 12:58

Всем привет. Просьба помочь в решении проблемы.
Есть два активити. Первое(главное) содержит кнопку и пустой список (вначале он пустой), по нажатию на кнопку открывается второе активити и заполняется список (файловый менеджер). Возле списка есть картинки, галочки и т.д. Внизу списка есть кнопка. При выборе элемента из списка и нажатии на кнопку я хочу снова открыть первое активити и заполнить список выбранными элементами из списка со второго активити. Проблема в том, что я не могу заполнить список первого активити. Я не могу его вывести в в Main lyaout.

Теперь чуть подробней:
Активити 2 содержит такой layout

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:descendantFocusability="blocksDescendants" >
    <TextView android:id="@+id/titleManager"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="5dip"
        android:textColor="#B22222"
        />
    <ListView
        android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1">
    </ListView>
    <Button
        android:id="@+id/button_OK"
        android:text="@string/button_OK"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="5dp"
        android:onClick="AddPathToList">
    </Button>
</LinearLayout>
Layout строки

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:descendantFocusability="blocksDescendants">
    <CheckBox
        android:id="@+id/cbBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </CheckBox>
    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_marginLeft="5dp"
        android:layout_weight="1"
        android:orientation="vertical">
        <TextView
            android:id="@+id/tvDescr"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:text=""
            android:textSize="20sp">
        </TextView>
    </LinearLayout>
    <ImageView
        android:id="@+id/ivImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher">
    </ImageView>
</LinearLayout>
Т.е. айдишник списка задается как "android:list". Для отображения списка я написал адаптер из BaseAdapter как в уроке 54.
Для списка из активити 1 я написал второй адаптер.
Вся соль в том, что список, который я заполняю для активити 1, отображается в активити 2, а потом уже запускается активити 1 и список пропадает. Список в активити 1 имеет айди "android:list", такой же как и список в активити 2. Если я пытаюсь задать айдишник в виде "@+id/MyId" и корректирую соответствующую строку в коде

Код: Выделить всё

 ListView lvMain = (ListView) findViewById(R.id.MyId); 
, то вылетает ошибка при запуске активити 1(главного активити). Когда прохожу дебаггером, то пишет "java.lang.IllegalStateException: Could not execute method of the activity". Я видать что-то упустил из виду и не могу понять что. Битый час уже пытаюсь разобраться.

MainActivity.java (активити 1)

Код: Выделить всё

public class MainActivity extends Activity implements OnClickListener {
    File path;
    Button btnSelectFolder; //Button Select Folder

    @Override
    protected void onCreate(Bundle savedInstanceState)  {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Serach button by ID
        btnSelectFolder = (Button) findViewById(R.id.button_select_folder);

        //Button click
        btnSelectFolder.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button_select_folder:
                // TODO Auto-generated method stub
                //Trying to create new activity: file manager
                Intent intent = new Intent(this, FileManager_Activity.class);
                startActivity(intent);
                break;
            default:
                break;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}
FileManager.java (активити 2)

Код: Выделить всё

public class FileManager_Activity extends ListActivity {
    //private List<String> directoryEntries = new ArrayList<String>();
    public static ArrayList<OptionsList> SelectedMusicDirList = new ArrayList<OptionsList>();
    private File currentDirectory = new File("/");
    private ArrayList<DirectoryList> directoryEntries = new ArrayList<DirectoryList>();
    private BoxAdapter boxAdapter;
    private OtherBoxAdapter OptionBoxAdapter;

    //when new activity starts it uses some layout
    @Override
    public void onCreate(Bundle iNew) {
        super.onCreate(iNew);
        //set main layout
        setContentView(R.layout.activity_file_manager);
        //browse to root directory
        browseTo(new File("/"));
    }

    //browse to file or directory
    private void browseTo(final File aDirectory){
        //if we want to browse directory
        if (aDirectory.isDirectory()){
            //fill list with files from this directory
            if (aDirectory.canRead()){
                this.currentDirectory = aDirectory;
                fill(aDirectory.listFiles());

                //set titleManager text
                TextView titleManager = (TextView) findViewById(R.id.titleManager);
                titleManager.setText(aDirectory.getAbsolutePath());

                boxAdapter = new BoxAdapter(this, directoryEntries);

                // настраиваем список
                ListView lvMain = (ListView) findViewById(android.R.id.list);
                lvMain.setAdapter(boxAdapter);
            }
            else{
                //Folder is system and we do not enter
                //....
            }
        }
        else {
            //if we want to open file, show this dialog:
            //listener when YES button clicked
            DialogInterface.OnClickListener okButtonListener = new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface arg0, int arg1) {
                    //intent to navigate file
                    Intent OpenFileIntent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("file://" + aDirectory.getAbsolutePath()));
                    //start this activity
                    startActivity(OpenFileIntent);
                }
            };
            //listener when NO button clicked
            DialogInterface.OnClickListener cancelButtonListener = new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface arg0, int arg1) {
                    //do nothing
                }
            };

            //create dialog
            new AlertDialog.Builder(this)
                    .setTitle("Please, accept your choice...") //title
                    .setMessage("Do you want to  open file "+ aDirectory.getName() + "?") //message
                    .setPositiveButton("Yes", okButtonListener) //positive button
                    .setNegativeButton("No", cancelButtonListener) //negative button
                    .show(); //show dialog
        }
    }
    //fill list
    private void fill(File[] files) {
        //clear list
        directoryEntries.clear();

        if (this.currentDirectory.getParent() != null)
            directoryEntries.add(new DirectoryList("..","..", R.drawable.ic_launcher, false));

        //add every file into list
        for (File file : files) {
            if (file.canRead()){
                directoryEntries.add(new DirectoryList(file.getName(),file.getAbsolutePath(),R.drawable.ic_launcher, false));
            }
        }
    }

    //browse to parent directory
    private void upOneLevel(){
        if(this.currentDirectory.getParent() != null) {
            browseTo(currentDirectory.getParentFile());
        }
    }
    //When you click OK Button
    public void AddPathToList(View v){
        int OptionsSize;
        ArrayList<String> FoldersList = new ArrayList<String>();
        for(DirectoryList dl : boxAdapter.getBox()){
            //If item is checked then boolean box = true
            if(dl.box){
                FoldersList.add(dl.getPath());
            }
        }
        if (FoldersList.size()!=0){
            OptionsSize = SelectedMusicDirList.size();
            SelectedMusicDirList.add(new OptionsList("Option " + (OptionsSize + 1) + ".",FoldersList,R.drawable.ic_launcher));
            OptionBoxAdapter = new OtherBoxAdapter(this, SelectedMusicDirList);

            Intent MainIntent = new Intent(this, MainActivity.class);
            startActivity(MainIntent);

            // настраиваем список
            ListView lvMain = (ListView) findViewById(R.id.list);
            lvMain.setAdapter(OptionBoxAdapter);

        }
        else{
            /*
            create dialog when no one where cheked, but button OK was pressed
            It means to take current folder
            listener when OK button clicked
            */
            DialogInterface.OnClickListener OkMusicButtonListener = new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface arg0, int arg1) {
                    int OptionsSize;
                    ArrayList<String> NewFoldersList = new ArrayList<String>();
                    Intent MainIntent;
                    TextView titleManager;
                    String FolderPath;

                    titleManager = (TextView) findViewById(R.id.titleManager);
                    FolderPath = titleManager.getText().toString();
                    NewFoldersList.add(FolderPath);
                    OptionsSize = SelectedMusicDirList.size();
                    SelectedMusicDirList.add(new OptionsList("Option " + (OptionsSize + 1) + ".",NewFoldersList,R.drawable.ic_launcher));
                    OptionBoxAdapter = new OtherBoxAdapter(getBaseContext(), SelectedMusicDirList);

                    // настраиваем список
                    ListView lvMain = (ListView) findViewById(android.R.id.list);
                    lvMain.setAdapter(OptionBoxAdapter);

                    MainIntent = new Intent(getBaseContext(), MainActivity.class);
                    startActivity(MainIntent);

                }
            };
            //listener when NO button clicked
            DialogInterface.OnClickListener CancelMusicButtonListener = new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface arg0, int arg1) {
                    //do nothing
                }
            };
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Please, choose folder..."); //title
            builder.setMessage("Do you want to add to a list current folder?"); //message
            builder.setPositiveButton("Yes", OkMusicButtonListener); //positive button
            builder.setNegativeButton("No", CancelMusicButtonListener); //negative button
            builder.show(); //show dialog
        }

    }

    //when you clicked onto item
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        //get selected file name
        DirectoryList selectedFileString= directoryEntries.get(position);

        //if we select ".." then go upper
        if(selectedFileString.getPath().equals("..")){
            upOneLevel();
        } else {
            //browse to clicked file or directory using browseTo()
            File clickedFile = null;
            clickedFile = new File(selectedFileString.getPath());
            if (clickedFile != null)
                browseTo(clickedFile);
        }
    }
}

Вот как вызываю 1 активити из второго активити:

Код: Выделить всё

   OptionsSize = SelectedMusicDirList.size();
            SelectedMusicDirList.add(new OptionsList("Option " + (OptionsSize + 1) + ".",FoldersList,R.drawable.ic_launcher));
            OptionBoxAdapter = new OtherBoxAdapter(this, SelectedMusicDirList);

            Intent MainIntent = new Intent(this, MainActivity.class);
            startActivity(MainIntent);

            // настраиваем список
            ListView lvMain = (ListView) findViewById(android.R.id.list);
            lvMain.setAdapter(OptionBoxAdapter);

Вот код второго адаптера

Код: Выделить всё

public class OtherBoxAdapter extends BaseAdapter{
    Context ctx;
    LayoutInflater lInflater;
    ArrayList<OptionsList> objects;

    OtherBoxAdapter(Context context, ArrayList<OptionsList> items) {
        ctx = context;
        objects = items;
        //lInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    // кол-во элементов
    @Override
    public int getCount() {
        return objects.size();
    }

    // элемент по позиции
    @Override
    public OptionsList getItem(int position) {
        return objects.get(position);
    }

    // id по позиции
    @Override
    public long getItemId(int position) {
        return position;
    }

    // пункт списка
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        lInflater = LayoutInflater.from(ctx);
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.selected_item, parent, false);
        }

        OptionsList p = getListPosition(position);

        //описание и картинка
        ((TextView) view.findViewById(R.id.OptionDesc)).setText(p.OptionDesc);
        ((ImageView) view.findViewById(R.id.OptionImage)).setImageResource(p.image);

        return view;
    }
    // позиция
    OptionsList getListPosition(int position) {
        return ((OptionsList) getItem(position));
    }
}
Заранее спасибо за помощь. Если нужно будет больше кода, то добавлю.
Последний раз редактировалось huligan 11 окт 2013, 14:15, всего редактировалось 4 раза.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Заполнить второй список в новом Aсtivity

Сообщение Foenix » 11 окт 2013, 13:32

если ошибки вылетают, надо их сюда тоже прилагать, в смысле какие ошибки - логи.

В данном случае лэйауты твои ни о чем не говорят, нужно было поместиь тут вызовы активити, как ты данные передаешь, что отображаешь и прочее. А вообще слишком сложно объясняешь, конечно..
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

huligan
Сообщения: 19
Зарегистрирован: 11 окт 2013, 12:28

Re: Заполнить второй список в новом Aсtivity

Сообщение huligan » 11 окт 2013, 13:45

Подправил описание ошибки, добавил лог. Сории, что запутано обьясняю. Просто и сам тольком не могу понять откуда ноги у ошибки ростут. Может, если запускается новое активити, то в этом активити должен быть метод который заполняет список? Может мне нужно использовать базу данных для сохранения значений списка, а при старте активити заполнять список из базы данных?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Заполнить второй список в новом Aсtivity

Сообщение Foenix » 11 окт 2013, 14:05

выбор делать бд или нет определяется тем, например, нужно ли сохранять данные между запусками приложения?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

huligan
Сообщения: 19
Зарегистрирован: 11 окт 2013, 12:28

Re: Заполнить второй список в новом Aсtivity

Сообщение huligan » 11 окт 2013, 14:13

Я понял. Я буду применять бд, но позже, не для текущего действия. Я вставил код активити 1 и активити 2. Это уже почти весь код всей программы.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Заполнить второй список в новом Aсtivity

Сообщение Foenix » 11 окт 2013, 14:20

данного лога, что вы привели - мало, нужно все красные строчки приводить, раз.
Беглый осмотр навеял вопрос - почему из второй активити нужно опять вызывать первую? почитай урок про startactivityforresult, ну вызвал ты вторую активити, она сверху, потом закрылась, под ней опять первая.. результаты из нее по уроку можно получить.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Заполнить второй список в новом Aсtivity

Сообщение Foenix » 11 окт 2013, 14:20

R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

huligan
Сообщения: 19
Зарегистрирован: 11 окт 2013, 12:28

Re: Заполнить второй список в новом Aсtivity

Сообщение huligan » 11 окт 2013, 14:30

Foenix писал(а):данного лога, что вы привели - мало, нужно все красные строчки приводить, раз.
Беглый осмотр навеял вопрос - почему из второй активити нужно опять вызывать первую? почитай урок про startactivityforresult, ну вызвал ты вторую активити, она сверху, потом закрылась, под ней опять первая.. результаты из нее по уроку можно получить.
У меня не было красных строк. Все запускалось и работало, но потом аварийно закрывалась программа. Что бы понять в чем дело, пришлось бежать дебаггером и я написал последнее значение в exception, перед закрытие программы. StartActivityForResult изучу. Отпишусь позже: удалось ли решить проблему.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Заполнить второй список в новом Aсtivity

Сообщение Foenix » 11 окт 2013, 14:32

Если программа аварийно закрывается, то в логе обязательно что-нибудь есть. Значит, плохо смотрел.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

huligan
Сообщения: 19
Зарегистрирован: 11 окт 2013, 12:28

Re: Заполнить второй список в новом Aсtivity

Сообщение huligan » 11 окт 2013, 14:44

Да, с логами я не досмотрел.

Вот полный лог в том моменте, когда вылетает прога:
10-11 10:11:03.512 18030-18030/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.IllegalStateException: Could not execute method of the activity
at android.view.View$1.onClick(View.java:3633)
at android.view.View.performClick(View.java:4240)
at android.view.View$PerformClick.run(View.java:17721)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at android.view.View$1.onClick(View.java:3628)
            at android.view.View.performClick(View.java:4240)
            at android.view.View$PerformClick.run(View.java:17721)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.playlist.playlist_generator.FileManager_Activity.AddPathToList(FileManager_Activity.java:137)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at android.view.View$1.onClick(View.java:3628)
            at android.view.View.performClick(View.java:4240)
            at android.view.View$PerformClick.run(View.java:17721)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Заполнить второй список в новом Aсtivity

Сообщение Foenix » 11 окт 2013, 14:53

Причина ошибки
Caused by: java.lang.NullPointerException
адрес
at com.playlist.playlist_generator.FileManager_Activity.AddPathToList(FileManager_Activity.java:137)
что с этой ошибкой делать наверное 100 раз объясняла,и буквально сегодня.
Но лучше вначале посмотреть урок, может такой код и не понадобится.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

huligan
Сообщения: 19
Зарегистрирован: 11 окт 2013, 12:28

Re: Заполнить второй список в новом Aсtivity

Сообщение huligan » 11 окт 2013, 15:53

Попытался я сделать startactivityforresult и наткнулся на то, что мне в putExtra нужно ложить кастомизированный объект. Вынуть его не так-то просто. В нете прочитал, что нужно делать сериализацию... Страшные слова однако. Может проще было разобраться с ошибкой, которая была в начале?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Заполнить второй список в новом Aсtivity

Сообщение Foenix » 11 окт 2013, 16:03

Про то, как искать ошибку я уже сказала.
И сказала про то, что если из одной активити вызывается другая, то обратно из второй не нужно вызывать первую интентом. Она уже есть под второй, при закрытии появится на экране.
ДОлго разбираться что именно ты передаешь в первую активити, но или как в уроке или в бд записать. Вызывать методы первой активити из второй не стоит.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

huligan
Сообщения: 19
Зарегистрирован: 11 окт 2013, 12:28

Re: Заполнить второй список в новом Aсtivity

Сообщение huligan » 16 окт 2013, 14:45

Привет еще раз. Не хотел создавать новую тему, так как это продолжение текущей темы. Я послушался совета и сделал вызов второго активити с возвратом значения. Приложения запускается, возвращает значение и не вылетает, но возникли другие нюансы и по ним я хотел бы спросить совет.

Я завершаю второе активити и возвращаю результат вот таким способом (как в уроке):

Код: Выделить всё

            Intent MainIntent = new Intent();
            MainIntent.putExtra("ArrayMusicDirList", FoldersList);
            setResult(RESULT_OK, MainIntent);
            finish();
После этого запускается снова второе активити. После того как я повторно выберу элемент из списка, повторно дойду до этого кода, то второе активити завершается как положено и возвращается результат в первое активити. Т.е. вопрос: почему запускается второе активити, когда оно должно завершиться и вернуть результат? Дебаггером я четко вижу что доходит до finish();

Ну а второй нюанс заключается в том, что я хочу вывести кастомизированный список. Для этого я написал адаптер, но он почему-то не выводит список. Может быть ошибка в том, что во втором активити, в Layout файле есть ListView с айдишником: "@id/android:list" ? Такой же ListView, с таким же айдишником есть в первом активити. Во втором активити все выводиться в список, а в первом - нет :(

huligan
Сообщения: 19
Зарегистрирован: 11 окт 2013, 12:28

Re: Заполнить второй список в новом Aсtivity

Сообщение huligan » 16 окт 2013, 17:36

Второй нюанс я уже разрулил: оказывается список ListView не отображался в TableRow. Как только я Layaout сделал в виде LinearLayout - все отобразилось. А насчет того, что finish() в одном и том же месте вкоде в первый раз перезапускает активити, а во второй раз завершает и возвращает результат... для меня это загадка недели.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Заполнить второй список в новом Aсtivity

Сообщение Foenix » 16 окт 2013, 19:46

huligan писал(а):После этого запускается снова второе активити. После того как я повторно выберу элемент из списка, повторно дойду до этого кода, то второе активити завершается как положено и возвращается результат в первое активити. Т.е. вопрос: почему запускается второе активити, когда оно должно завершиться и вернуть результат? Дебаггером я четко вижу что доходит до finish();
Сложно сказать, почему у тебя активити два раза открывается, если я правильно поняла, нужно код смотреть
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

huligan
Сообщения: 19
Зарегистрирован: 11 окт 2013, 12:28

Re: Заполнить второй список в новом Aсtivity

Сообщение huligan » 17 окт 2013, 13:03

Foenix писал(а):Сложно сказать, почему у тебя активити два раза открывается, если я правильно поняла, нужно код смотреть
Пытался я разобраться сам, но это выше моих сил. Вот код первого активити (MainActivity):

Код: Выделить всё

public class MainActivity extends ListActivity implements OnClickListener {
    final int REQUEST_CODE_OPTION = 1;
    public ArrayList<OptionsList> MusicOptionsList=new ArrayList<OptionsList>();
    private OtherBoxAdapter OptionBoxAdapter;

    File path;
    Button btnSelectFolder; //Button Select Folder
    Button btnGeneratePL; //Button Generate Play List
    TextView tvName;
    int ListSize;

    @Override
    protected void onCreate(Bundle savedInstanceState)  {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Search button by ID
        btnSelectFolder = (Button) findViewById(R.id.button_select_folder);

        //Button click
        btnSelectFolder.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button_select_folder:
                // TODO Auto-generated method stub
                //Trying to create new activity fir file manager
                Intent intent = new Intent(this, FileManager_Activity.class);
                startActivity(intent);
                startActivityForResult(intent, REQUEST_CODE_OPTION);
                break;
            default:
                break;
        }
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // запишем в лог значения requestCode и resultCode
        Log.d("myLogs", "requestCode = " + requestCode + ", resultCode = " + resultCode);
        // если пришло ОК
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case REQUEST_CODE_OPTION:
                    ArrayList<String> PathList = data.getStringArrayListExtra("ArrayMusicDirList");
                    ListSize=MusicOptionsList.size()+1;
                    MusicOptionsList.add(new OptionsList("Option " + ListSize,PathList,R.drawable.ic_launcher));
                    OptionBoxAdapter = new OtherBoxAdapter(this, MusicOptionsList);

                    ListView lvMain = (ListView) findViewById(android.R.id.list);
                    lvMain.setAdapter(OptionBoxAdapter);
                    tvName=(TextView) findViewById(R.id.hello_world);
                    tvName.setText("Folders generated!");
                    checkList();
                    break;
            }
            // если вернулось не ОК
        } else {
            Toast.makeText(this, "Wrong result", Toast.LENGTH_SHORT).show();
        }
    }

    //Check if list exists. If so - unhide button Generate
    private void checkList(){
        if(MusicOptionsList.size()!=0){
            btnGeneratePL=(Button) findViewById(R.id.generate);
            btnGeneratePL.setVisibility(View.VISIBLE);
        }
        else{
            btnGeneratePL.setVisibility(View.GONE);
        }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}
Вот код второго активити(FileManager_Activity ):

Код: Выделить всё

public class FileManager_Activity extends ListActivity {
    //private List<String> directoryEntries = new ArrayList<String>();
    public static ArrayList<OptionsList> SelectedMusicDirList = new ArrayList<OptionsList>();
    private File currentDirectory = new File("/");
    private ArrayList<DirectoryList> directoryEntries = new ArrayList<DirectoryList>();
    private BoxAdapter boxAdapter;
    private OtherBoxAdapter OptionBoxAdapter;

    //when new activity starts it uses some layout
    @Override
    public void onCreate(Bundle iNew) {
        super.onCreate(iNew);
        //set main layout
        setContentView(R.layout.activity_file_manager);
        //browse to root directory
        browseTo(new File("/"));
    }

    //browse to file or directory
    private void browseTo(final File aDirectory){
        //if we want to browse directory
        if (aDirectory.isDirectory()){
            //fill list with files from this directory
            if (aDirectory.canRead()){
                this.currentDirectory = aDirectory;
                fill(aDirectory.listFiles());

                //set titleManager text
                TextView titleManager = (TextView) findViewById(R.id.titleManager);
                titleManager.setText(aDirectory.getAbsolutePath());

                boxAdapter = new BoxAdapter(this, directoryEntries);

                // настраиваем список
                ListView lvMain = (ListView) findViewById(android.R.id.list);
                lvMain.setAdapter(boxAdapter);
            }
            else{
                //Folder is system and we do not enter
                //....
            }
        }
        else {
            //if we want to open file, show this dialog:
            //listener when YES button clicked
            DialogInterface.OnClickListener okButtonListener = new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface arg0, int arg1) {
                    //intent to navigate file
                    Intent OpenFileIntent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("file://" + aDirectory.getAbsolutePath()));
                    //start this activity
                    startActivity(OpenFileIntent);
                }
            };
            //listener when NO button clicked
            DialogInterface.OnClickListener cancelButtonListener = new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface arg0, int arg1) {
                    //do nothing
                    //or add something you want
                }
            };

            //create dialog
            new AlertDialog.Builder(this)
                    .setTitle("Please, accept your choice...") //title
                    .setMessage("Do you want to  open file "+ aDirectory.getName() + "?") //message
                    .setPositiveButton("Yes", okButtonListener) //positive button
                    .setNegativeButton("No", cancelButtonListener) //negative button
                    .show(); //show dialog
        }
    }
    //fill list
    private void fill(File[] files) {
        //clear list
        directoryEntries.clear();

        if (this.currentDirectory.getParent() != null)
            directoryEntries.add(new DirectoryList("..","..", R.drawable.ic_launcher, false));

        //add every file into list
        for (File file : files) {
            if (file.canRead()){
                directoryEntries.add(new DirectoryList(file.getName(),file.getAbsolutePath(),R.drawable.ic_launcher, false));
            }
        }
    }

    //browse to parent directory
    private void upOneLevel(){
        if(this.currentDirectory.getParent() != null) {
            browseTo(currentDirectory.getParentFile());
        }
    }
    //When you click OK Button
    public void AddPathToList(View v){
        ArrayList<String> FoldersList = new ArrayList<String>();
        for(DirectoryList dl : boxAdapter.getBox()){
            //If item is checked then boolean wasChecked = true
            if(dl.wasChecked){
                FoldersList.add(dl.getPath());
            }
        }
        if (FoldersList.size()!=0){
            Intent MainIntent = new Intent();
            MainIntent.putExtra("ArrayMusicDirList", FoldersList);
            setResult(RESULT_OK, MainIntent);
            finish();

        }
        else{
            /*
            create dialog when no one where checked, but button OK was pressed
            It means to take current folder
            listener when OK button clicked
            */
            DialogInterface.OnClickListener OkMusicButtonListener = new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface arg0, int arg1) {
                    ArrayList<String> NewFoldersList = new ArrayList<String>();
                    TextView titleManager;
                    String FolderPath;

                    titleManager = (TextView) findViewById(R.id.titleManager);
                    FolderPath = titleManager.getText().toString();
                    NewFoldersList.add(FolderPath);

                    Intent MainIntent = new Intent();
                    MainIntent.putExtra("ArrayMusicDirList", NewFoldersList);
                    setResult(RESULT_OK, MainIntent);
                    finish();

                }
            };
            //listener when NO button clicked
            DialogInterface.OnClickListener CancelMusicButtonListener = new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface arg0, int arg1) {
                    //do nothing
                    //or add something you want
                }
            };
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("Please, choose folder..."); //title
                builder.setMessage("Do you want to add to a list current folder?"); //message
                builder.setPositiveButton("Yes", OkMusicButtonListener); //positive button
                builder.setNegativeButton("No", CancelMusicButtonListener); //negative button
                builder.show(); //show dialog
        }


    }

    //when you clicked onto item
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        //get selected file name
        DirectoryList selectedFileString= directoryEntries.get(position);

        //if we select ".." then go upper
        if(selectedFileString.getPath().equals("..")){
            upOneLevel();
        } else {
            //browse to clicked file or directory using browseTo()
            File clickedFile = null;
            clickedFile = new File(selectedFileString.getPath());
            if (clickedFile != null)
                browseTo(clickedFile);
        }
    }
}
Второе активити после "finish();" запускается второй раз. На второй раз "finish();" срабатывает и результат передается в первый активити. При этом результат передается тот, который был при первом обращении к активити (когда первый раз до "finish();" доходит). Мистика какая-то.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Заполнить второй список в новом Aсtivity

Сообщение Foenix » 17 окт 2013, 13:55

startActivity(intent);
startActivityForResult(intent, REQUEST_CODE_OPTION);

ченить одно выбери?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

huligan
Сообщения: 19
Зарегистрирован: 11 окт 2013, 12:28

Re: Заполнить второй список в новом Aсtivity

Сообщение huligan » 17 окт 2013, 15:32

Foenix писал(а):startActivity(intent);
startActivityForResult(intent, REQUEST_CODE_OPTION);

ченить одно выбери?
Спасибо. Помогло. С меня пиво? =)

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Заполнить второй список в новом Aсtivity

Сообщение Foenix » 17 окт 2013, 16:04

надо ту же магию (или мистику) заставить сюда перенести баночку :-D
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить