Фрагмент вопроса, где строить кнопки и т. Д. - PullRequest
0 голосов
/ 13 июля 2020

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

image

А вот детали фрагмента:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/button_layout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="10dp"
    tools:context=".FragmentDetails">

    <!--Blank Fragment Layout-->
    <TextView
        android:id="@+id/questions_text_view1"
        android:layout_width="match_parent"
        android:layout_height="91dp"
        android:gravity="center"
        android:textAlignment="center"
        />

</FrameLayout>

Обновлено FragmentDetails

public class FragmentDetails extends Fragment {


    private final String TAG = getClass().getSimpleName();
    private List<Integer> mQuestionIds;
    private int mListIndex;



    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //Inflate the fragment layout
        View rootView = inflater.inflate(R.layout.fragment_details, container, false);

        //Get a reference to the textView in the fragment layout
        final TextView textView = (TextView) rootView.findViewById(R.id.questions_text_view1);
        if (mQuestionIds != null) {
            textView.setText(mQuestionIds.get(mListIndex));
            //Increment the position in the question lisy as long as index is less than list length
            if (mListIndex < mQuestionIds.size() - 1) {
                mListIndex++;
                setmQuestionIds(QuestionList.getQuestions());
                setmListIndex(mListIndex);
            } else {
                //end of questions reached
                textView.setText("End of questions");
            }
            //Set the text resource to display the list item at that stored index
            textView.setText(mQuestionIds.get(mListIndex));

        }
    else {
        //Log message that list is null
        Log.d(TAG, "No questions left");
    }

    //return root view
            return rootView;

}


    public void setmQuestionIds (List < Integer > mQuestionIds) {
        this.mQuestionIds = mQuestionIds;
    }

    public void setmListIndex ( int mListIndex){
        this.mListIndex = mListIndex;
    }
}

Действия с фрагментом

public class FragmentActions extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_actions);

        Button yes = findViewById(questions_yes1);

        // Only create new fragments when there is no previously saved state
        if (savedInstanceState == null) {
            //Create Question Fragment
            final FragmentDetails fragmentDetails = new FragmentDetails();
            fragmentDetails.setmQuestionIds(QuestionList.getQuestions());


            yes.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

            //set the list of question Ids for the head fragent and set the position to the second question

            //Fragment manager and transaction to add this fragment
            FragmentManager fragmentManager = getSupportFragmentManager();

                  fragmentManager.beginTransaction()
                         .replace(R.id.question_container1, fragmentDetails)
                            .commit();

                }
            });
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Думаю, на ваш вопрос нет правильного ответа. Вы можете попробовать разные подходы.

Возможно, вы могли бы реализовать кнопки в контейнере фрагмента, как указал @smmehrab. Я считаю это более сложным решением, потому что, когда вы щелкаете элемент из контейнера, вы можете управлять представлениями контейнера, а не представлениями фрагмента. Если я правильно помню, вы получили бы NullPointer. Это происходит потому, что контекст при нажатии кнопки в контейнере фрагмента отличается от контекста при щелчке изнутри фрагмента. Таким образом, вы должны реализовать интерфейс в контейнере фрагмента, который прослушивает щелчки, а фрагмент улавливает щелчок. Вы могли бы это сделать, и я действительно делаю это в своем текущем приложении, но у меня нет выбора.

Вместо этого вы можете использовать Motion Layout (который расширяется от Constraint Layout) в качестве root представления вашего фрагмента вместо CardView. Таким образом, вы можете установить все представления фрагментов с плоской иерархией (плоские иерархии сокращают время рендеринга, так что это улучшение, и вы можете использовать CardView как один дочерний элемент) и установить кнопки прямо там, в макете движения (помните, движение layout будет видом root фрагмента). Вы можете прямо здесь установить прослушиватель кликов и реализовать анимацию между разными textViews.

Я уверен, что есть много других решений, примите это только как вклад.

Если вы незнакомы с Motion Layout вы можете просто погуглить, android официальная документация по этому поводу великолепна.

0 голосов
/ 13 июля 2020

Если ваши Button остаются прежними, а TextView изменяется, вы можете добавить свои Button в контейнер фрагментов .

Помните, что ваши фрагменты будут быть представлены внутри FrameLayout контейнера фрагмента . Вы должны сохранить свои Button за пределами FrameLayout.

Или, если вы хотите иметь разные Button s для разных фрагментов (вопросы, в вашем случае), вы также можете добавить Button s к фрагментам . Но в этом случае вам нужно добавить их отдельно к каждому из фрагментов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...