Открыть новый фрагмент от FragmentActivity

У меня есть MainActivity, которая расширяет FragmentActivity и у меня также есть ConnectionListFragment, который содержит список идентификаторов соединений. И когда пользователь нажимает на идентификатор соединения, я хочу открыть новый LogFragment (это расширяет Fragment) и дать более подробную информацию об этой связи. Но проблема в том, что когда пользователь выбирает фрагмент идентификатора соединения, он никогда не показывается. Вот мой код MainActiviy

public class MainActivity extends FragmentActivity implements LogTextUpdater, LogDetail{

    private PagerAdapter mPagerAdapter;
    private static int id;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        UiFragment.setLog(this);
        ConnectionListFragment.setLogDetail(this);

        initialisePaging();
    }

    private void initialisePaging() {
        List<Fragment> fragments = new Vector<>();
        fragments.add(Fragment.instantiate(this, UiFragment.class.getName()));
        fragments.add(Fragment.instantiate(this, ConnectionListFragment.class.getName()));
        mPagerAdapter = new PagerAdapter(getSupportFragmentManager(), fragments);
        ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
        pager.setAdapter(mPagerAdapter);
    }

    @Override
    public void updateText(String sender) {
        //LogFragment.readFromDatabase(sender);
        ConnectionListFragment.updateList();

        Toast.makeText(this, sender, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void startFragment(String connectionID) {
        Toast.makeText(this, "Start " + connectionID, Toast.LENGTH_SHORT).show();

        LogFragment logFrag = new LogFragment();
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        logFrag.setConnectionID(connectionID);
        ft.replace(R.id.sample_content_fragment, logFrag);
        ft.addToBackStack(null);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.commit();
    }
}

мой main_activity.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />
    <FrameLayout
        android:id="@+id/sample_content_fragment"
        android:layout_weight="2"
        android:layout_width="match_parent"
        android:layout_height="0px" />
</LinearLayout>

и вот мой ConnectionListFragment

public class ConnectionListFragment extends Fragment{

    private static SQLiteDatabase db;
    private static SQLiteOpenHelper helper;
    private static Context context;
    private static ListView listView;
    private static SimpleCursorAdapter adapter;
    private static LogDetail logDetail;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = getActivity();

        adapter = new SimpleCursorAdapter(context, R.layout.connection_list, null,
                new String[]{Constants.SESSION_ID}, new int[]{R.id.connectID}, 0);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_connection_list, container, false);
    }

    public static void setLogDetail(LogDetail logTextUpdater){
        logDetail = logTextUpdater;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        listView = (ListView) view.findViewById(R.id.listView);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String selectedID = ((TextView) view.findViewById(R.id.connectID)).getText().toString();
                //Toast.makeText(getActivity(), selectedID, Toast.LENGTH_SHORT).show();
                logDetail.startFragment(selectedID);
            }
        });
    }

    public static void updateList(){
        new ConnectionListID().execute();
    }

    public static class ConnectionListID extends AsyncTask<Void, Void, Cursor> {

        @Override
        protected Cursor doInBackground(Void... params) {
            helper = new Database(context);
            db = helper.getReadableDatabase();
            return db.query(true, Constants.TABLE_NAME, new String[]{"_id", Constants.SESSION_ID},
                    null, null, Constants.SESSION_ID, null, null, null);
        }

        @Override
        protected void onPostExecute(Cursor cursor) {
            super.onPostExecute(cursor);

            adapter.changeCursor(cursor);
            listView.setAdapter(adapter);
        }
    }
}

Так что может быть не так с моим кодом. Я гарантирую, что startFragment метод вызывается, когда пользователь нажимает на один из элементов списка, потому что я вижу Toast на моем устройстве.

2 ответа

Решение

Согласно вашему коду, контейнер имеет высоту 0px, поэтому он не виден.

<FrameLayout
    android:id="@+id/sample_content_fragment"
    android:layout_weight="2"
    android:layout_width="match_parent"
    android:layout_height="0px" />

Исходя из вашего использования, я бы предложил вам создать новую активность только с этим FrameLayout, с высотой match_parent содержать ваш LogFragment.

Нет никакой разницы между FragmentActivity и Activity, за исключением поддержки более низких версий ОС для фрагмента.

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

Фрагмент не похож на действие Итак, вы не можете начать новый фрагмент как новое действие.

Другие вопросы по тегам