Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 08.02.2016
Сообщений: 90
1

Как с ListFragment передать имя файла чтобы открыть его в другом Активити?

13.03.2016, 01:13. Показов 1374. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет, я новичек! ломаю голову над такой задачей:
Есть ListFragment со списком "приборов" мне надо при нажатии на нужный прибор открыть PDF файл из ASSETS в другом активити. Как окрывать PDF файл я разобрался и при жестком введении нужного файла он открывается, а мне нужно чтоб разные файлы окрывались в этом активити. Вот мои наработки:

ListFragment:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.example.hosse.systemsaps.proizvoditeli;
 
import android.annotation.TargetApi;
import android.app.ListFragment;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
 
import com.example.hosse.systemsaps.PDFViewActivity;
 
import static android.R.layout.simple_list_item_1;
 
 
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class Bolod extends ListFragment {
 
    public static final String ABOUT_FILE = "about_file"; // ключ для передачи в другую активность
 
 
    private String[] myControllers = new String[] {"прибор-1", "прибор-2", "прибор-3"};
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        ArrayAdapter<String> myPAdapter = new ArrayAdapter<String>(getActivity(), simple_list_item_1, myControllers);
 
        setListAdapter(myPAdapter);
    }
 
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
 
 
        Intent intent = new Intent(getActivity(), PDFViewActivity.class);
 
        if(position == 0){
            intent.putExtra("прибор-1.pdf", ABOUT_FILE);
            startActivity(intent);
        }else
        if(position == 1){
            intent.putExtra("прибор-2.pdf", ABOUT_FILE);
            startActivity(intent);
 
        }
 
    }
}
PDFViewActivity:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.example.hosse.systemsaps;
 
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
 
import com.joanzapata.pdfview.PDFView;
import com.joanzapata.pdfview.listener.OnPageChangeListener;
 
public class PDFViewActivity extends AppCompatActivity implements OnPageChangeListener {
 
    String ABOUT_FILE = getIntent().getStringExtra("about_file");
 
    PDFView pdfView;
 
    String pdfName = ABOUT_FILE;
 
    Integer pageNumber = 1;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pdftest);
 
 
        pdfView = (PDFView) findViewById(R.id.pdfView);
        display(pdfName, false);
    }
 
    private void display(String assetFileName, boolean jumpToFirstPage) {
        if (jumpToFirstPage)
            pageNumber = 1;
        setTitle(pdfName = assetFileName);
 
        pdfView.fromAsset(assetFileName).defaultPage(pageNumber)
                .onPageChange(this).load();
    }
 
    @Override
    public void onPageChanged(int page, int pageCount) {
        pageNumber = page;
        setTitle(pdfName = pageNumber + "");
    }
}
вот уже везде все излазил, не могу понять что не так!
помогите плиз!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.03.2016, 01:13
Ответы с готовыми решениями:

Как передать имя файла из блока и открыть
Привет всем, программа ищет файл на жестком по имени, потом выводит имена файлов и пути к ним, если...

Как передать через intent нажатие кнопки в другом активити
В первом активити у нас есть две кнопки 1 и 2. Во втором активити ещё две кнопки 3 и 4. Вопрос в...

Как сделать чтобы при сохранении файла в папку его имя было рандомным?
Имеется программа которая делает скриншот, и сразу-же сохраняет его в папке. Как сделать так чтобы...

Открытие файла в C# - как правильно указать путь к файлу, чтобы на другом компьютере не надо было его менять?
Здравствуйте! Подскажите пожалуйста как правильно указать путь к файлу что бы на другом компьютере...

12
104 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 474
13.03.2016, 01:47 2
А откуда запускается твой фрагмент?
0
0 / 0 / 0
Регистрация: 08.02.2016
Сообщений: 90
13.03.2016, 14:43  [ТС] 3
я немного не понял вопрос?

Добавлено через 3 часа 22 минуты
если нужна пред история то этот фрагмент запускается через другой фрагмент способом fTrans.replace(R.id.container, bolod); а тот в свою очередь запускается из мэйнактивити.

Добавлено через 1 час 12 минут
что, никто подсказать в чем ошибка не может?
0
104 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 474
13.03.2016, 15:12 4
А разве фрагменты придумали не для того, чтобы не делать несколько активити?
0
59 / 48 / 13
Регистрация: 03.09.2013
Сообщений: 474
13.03.2016, 16:08 5
Bundle.
0
0 / 0 / 0
Регистрация: 08.02.2016
Сообщений: 90
13.03.2016, 17:17  [ТС] 6
Возможно, но только я пока не во всем разбираюсь
0
59 / 48 / 13
Регистрация: 03.09.2013
Сообщений: 474
13.03.2016, 17:41 7
http://stackoverflow.com/quest... r-fragment
1
0 / 0 / 0
Регистрация: 08.02.2016
Сообщений: 90
14.03.2016, 09:21  [ТС] 8
DemD10, а через интент в моем случае никак?
мне надо чтобы при нажатии пунката прибор-1 открылся файл прибор-1.PDF в классе PDFViewActivity. тоесть в этом фрагменте я должен присвоить String ABOUT_FILE = значение прибор-1.PDF,соответственно при нажатии другого пунката, ему присваивались другие значение
0
59 / 48 / 13
Регистрация: 03.09.2013
Сообщений: 474
14.03.2016, 10:00 9
Пробуйте интентом, в интернете полно инфы)) http://stackoverflow.com/quest... on-android
0
0 / 0 / 0
Регистрация: 08.02.2016
Сообщений: 90
15.03.2016, 19:35  [ТС] 10
Спасибо ребята, с передачей разобрался, все очень помогли.

Добавлено через 5 часов 42 минуты
Все таки у темы будет продолжение: данные передаются и принимаются в классе PDFViewActivity это видно с помощью Toast.makeText(this, value, Toast.LENGTH_LONG).show(); , но дальше процесс так и не идет.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class PDFViewActivity extends AppCompatActivity implements OnPageChangeListener {
 
    String value;
 
    PDFView pdfView;
 
    String pdfName = value;
 
    Integer pageNumber = 1;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pdftest);
 
 
        pdfView = (PDFView) findViewById(R.id.pdfView);
        display(pdfName, false);
 
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
 
            value = bundle.getString("sample_name");
        }
 
        Toast.makeText(this, value, Toast.LENGTH_LONG).show();
    }
 
    private void display(String assetFileName, boolean jumpToFirstPage) {
        if (jumpToFirstPage)
            pageNumber = 1;
        setTitle(pdfName = assetFileName);
 
        pdfView.fromAsset(assetFileName).defaultPage(pageNumber)
                .onPageChange(this).load();
    }
 
    @Override
    public void onPageChanged(int page, int pageCount) {
        pageNumber = page;
        setTitle(pdfName = pageNumber + "");
    }
}
Если в начальном значении переменных String pdfName = value; в место value вставить ожидаемое значение "прибор-1.pdf" то файл шикарно открывается. Как я понял что значение value = bundle.getString("sample_name"); не присваивается pdfName так как он не виден из метода onCreate и как я догадываюсь нужно вернуть значение из метода. но как это сделать не могу понять.
0
104 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 474
15.03.2016, 22:01 11
Дааа. Такой сумбур поискать еще. Объявляем String value. Оно, естественно, равно null.
Потом пишем String pdfName = value; pdfName тоже становится null. Хотя с тем же успехом можно было написать просто String pdfName; Все равно null.
Потом пишем value = bundle.getString("sample_name"); И value становится равно некоему sample_name.
Спрашивается в задачнике: чему при этом равно pdfName?

Добавлено через 8 минут
Напиши по человечески, откуда вызывается фрагмент, куда он что передает и как запускается вторая активити. Лично я бы присобачил фрагменту интерфейс, первой активити соответствующий листенер, в нем бы получал из фрагмента имя файла и передавал его в bundle.

Добавлено через 1 минуту
А еще лучше вместо второй активити сделал бы второй фрагмент.

Добавлено через 9 минут
Ну а если не хочешь писать, следим за ручками:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class PDFViewActivity extends AppCompatActivity implements OnPageChangeListener {
 
    PDFView pdfView;
    Integer pageNumber = 1;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pdftest);
 
 
        pdfView = (PDFView) findViewById(R.id.pdfView);
         
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
            display(bundle.getString("sample_name"), false);
        }
        Toast.makeText(this, value, Toast.LENGTH_LONG).show();
    }
 
    private void display(String assetFileName, boolean jumpToFirstPage) {
            if (jumpToFirstPage) pageNumber = 1;
            setTitle(assetFileName);
            pdfView.fromAsset(assetFileName).defaultPage(pageNumber).onPageChange(this).load();
    }
 
    @Override
    public void onPageChanged(int page, int pageCount) {
        pageNumber = page;
        setTitle(pdfName = pageNumber + "");
    }
}
Добавлено через 9 минут
if (jumpToFirstPage) pageNumber = 1;


Очень интересная строчка, хоть и не относится к теме топика. pageNumber был объявлен как 1.
То есть если jumpToFirstPage = false, мы с ним ничего не делаем, и он так и остается равным 1.
А если jumpToFirstPage = true, то мы присваиваем pageNumber значение 1. Шикарная логика.
0
0 / 0 / 0
Регистрация: 08.02.2016
Сообщений: 90
16.03.2016, 21:35  [ТС] 12
OlegJV, я использую как основное активити шаблон Navigation Drawer Activity, далее с помощью конструкции
Java
1
2
if (id == R.id.nav_aps) {
            fTrans.replace(R.id.container, fragmentAps);
вызываю второй фрагмент который является лист-фрагмент активити FragmentAps.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import android.annotation.TargetApi;
import android.app.FragmentTransaction;
import android.app.ListFragment;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
 
import com.example.hosse.systemsaps.PolozenieAps;
import com.example.hosse.systemsaps.R;
 
import static android.R.layout.simple_list_item_1;
 
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class FragmentAps extends ListFragment {
 
    private String[] myAps = { "Общее положение", "Производители", "Нормы и правила"};
 
    FragmentApsP fragmentApsP = new FragmentApsP();
 
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        ArrayAdapter<String> myApsAdapter = new ArrayAdapter<String>(getActivity(), simple_list_item_1, myAps);
        setListAdapter(myApsAdapter);
    }
 
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
 
        FragmentTransaction fTrans = getFragmentManager().beginTransaction();
 
        if(position == 0){
            startActivity(new Intent(getActivity(), PolozenieAps.class));
        }else if(position == 1){
            fTrans.replace(R.id.container, fragmentApsP);
        }fTrans.commit();
    }
}
с него я уже вызываю еще один лист фрагмент, через который вызываю еще один лист фрагмент тот самый что в этой теме выше.

Смысл получается такой что с главного активити я попадаю в список, в этом списке выбираю нужную позицию и перехожу в следущий список с производителями, выбрав производителя, выбираю список оборудования этого производителя и мне как раз надо открыть файл PDF с инструкцией.

Добавлено через 3 минуты
Возможно все это можно сделать проще, но я пока учусь))
Спасибо что помог с кодом открытия фалов pdf, я бы еще долго додумывался как все осуществить.
0
104 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 474
16.03.2016, 23:20 13
Это просто жуть. FragmentTransaction в фрагменте?

Слушай, если есть желание, напиши мне на почту oleg.j.v@gmail.com. Так получилось, что у меня сейчас много свободного времени, может смогу чем помочь. Давай побережем нервы остальных форумчан.
0
16.03.2016, 23:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2016, 23:20
Помогаю со студенческими работами здесь

Передать имя загруженного файла и использовать его
Доброго времени суток, уважаемые форумчане! if(is_uploaded_file($_FILES)) {...

Как передать ссылку на элемент активити в другой класс чтобы провести операции надо ним
Такая задача сложилась. есть активити MainActivity: public class MainActivity extends Main {...}...

Ввести с клавиатуры имя файла и передать его в функцию
Сабж, получаем с клавиатуры имя файла .txt, чтобы далее создать его и выводить туда результат...

Задание : ввести имя файла с клавиатуры и если есть то открыть его
Задание такое вести полное имя файла с клавиатуры и если он существует, то открыть его,...

Как передать тип класса и создать его в другом классе?
Добрый день, форумчане! Есть у меня классы юнитов - Walk, Strong, Fast. Все от абстрактного класса...

Как узнать полное имя файла зная его краткое имя?
например при запуске программы достаточно написать &quot;Excel&quot; или &quot;Calc&quot; при этом система уже в курсе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru