android - 在 Android Studio 中单击 ListFragment 中的项目时显示详细信息 fragment

标签 android android-listfragment onitemclick

我的应用有一个标签栏,应该始终可见。第一个选项卡包含一个 ListFragment。当我单击其中的一个项目时,它会加载一个新 Activity ,该 Activity 创建一个显示列表中对象内容的详细信息 fragment 。我想显示这个内容而不必开始一个新的 Activity ,因为它也会破坏标签栏!

如有任何帮助,我们将不胜感激!

为了说明,这里有一些截图和代码:

ListFragment After an item in the list has been clicked

这是创建选项卡的 FragmentActivity 的代码:

public class MainFragmentActivity extends FragmentActivity
    implements ActionBar.TabListener {

SectionsPagerAdapter sectionsPagerAdapter = null;
ViewPager viewPager = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    getActionBar().setDisplayShowHomeEnabled(false);
    getActionBar().setDisplayShowTitleEnabled(false);

    sectionsPagerAdapter =
            new SectionsPagerAdapter
                    (
                            getSupportFragmentManager());

    viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(sectionsPagerAdapter);

    viewPager.setOnPageChangeListener(
            new ViewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    actionBar.setSelectedNavigationItem(position);
                }
            });    // End of sectionPageAdapter.

    Tab browseTab = actionBar.newTab();
    browseTab.setIcon(R.drawable.search);
    browseTab.setTabListener(this);
    actionBar.addTab(browseTab);

    Tab myStuffTab = actionBar.newTab();
    myStuffTab.setIcon(R.drawable.my_stuff);
    myStuffTab.setTabListener(this);
    actionBar.addTab(myStuffTab);

    Tab profileTab = actionBar.newTab();
    profileTab.setIcon(R.drawable.profile);
    profileTab.setTabListener(this);
    actionBar.addTab(profileTab);

    Tab settingsTab = actionBar.newTab();
    settingsTab.setIcon(R.drawable.settings);
    settingsTab.setTabListener(this);
    actionBar.addTab(settingsTab);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onTabSelected(ActionBar.Tab tab,
                          FragmentTransaction fragmentTransaction) {
    viewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}

@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}

public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {

            case 0:
                Fragment browseFragment = new BrowseFragment();
                Bundle browseArgs = new Bundle();
                browseArgs.putInt(BrowseFragment.sectionNumberKey, position + 1);
                browseFragment.setArguments(browseArgs);
                return browseFragment;

            case 1:
                Fragment myStuffFragment = new MyStuffFragment();
                Bundle myStuffArgs = new Bundle();
                myStuffArgs.putInt(BrowseFragment.sectionNumberKey, position + 1);
                myStuffFragment.setArguments(myStuffArgs);
                return myStuffFragment;

            case 2:
                Fragment profileFragment = new ProfileFragment();
                Bundle profileArgs = new Bundle();
                profileArgs.putInt(BrowseFragment.sectionNumberKey, position + 1);
                profileFragment.setArguments(profileArgs);
                return profileFragment;

            case 3:
                Fragment settingsFragment = new SettingsFragment();
                Bundle settingsArgs = new Bundle();
                settingsArgs.putInt(BrowseFragment.sectionNumberKey, position + 1);
                settingsFragment.setArguments(settingsArgs);
                return settingsFragment;
        }
        return null;
    }

    // There are always 4 tabs
    @Override
    public int getCount() {
        return 4;
    }

    // Return a CharSequence for the selected tab
    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return getString(R.string.title_section1).toUpperCase();
            case 1:
                return getString(R.string.title_section2).toUpperCase();
            case 2:
                return getString(R.string.title_section3).toUpperCase();
            case 3:
                return getString(R.string.title_section4).toUpperCase();

        }
        return null;
    }
}

}    // End of class.

这是第一个选项卡的代码:

public class BrowseFragment extends ListFragment {


public static String sectionNumberKey = "sec_num";
private String activityName = "Browse";

int currentPosition = 0;

List<Listing> listings = new ListingData().getListings();

public BrowseFragment() {}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    BrowseArrayAdapter adapter = new BrowseArrayAdapter(getActivity(),
            R.layout.browselist_item,
            listings);
    setListAdapter(adapter);
}

@Override
public View onCreateView(LayoutInflater inflater,
                         ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_browse,
            container, false);

    TextView tv = (TextView) rootView.findViewById(R.id.section_label);

    int intSectionNumber = getArguments().getInt(sectionNumberKey);
    String numAsString = Integer.toString(intSectionNumber);
    tv.setText(numAsString);

    activityName += " " + numAsString;
    return rootView;
}


@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    showDetails(position);
}

void showDetails(int index) {
    currentPosition = index;

    Intent intent = new Intent();
    intent.setClass(getActivity(), BrowseDetailsActivity.class);
    intent.putExtra("index", index);
    startActivity(intent);
}

下面是详细 Activity 的代码:

public class BrowseDetailsActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState == null) {
        // During initial setup, plug in the details fragment.
        BrowseDetailFragment details = new BrowseDetailFragment();
        details.setArguments(getIntent().getExtras());
        getFragmentManager().beginTransaction().add(android.R.id.content, details).commit();
    }
}
}

最佳答案

基本上,您只需在 BrowseFragment 的 showDetails 方法中使用 BrowseDetailActivity 的 onCreate 方法的内容。通过这种方式,您可以删除 BrowseDetailsActivity。

浏览 fragment .java

void showDetails(int index) {
    BrowseDetailFragment details = BrowseDetailFragment.newInstance(index);
    getChildFragmentManager().beginTransaction().add(details).commit();
}

然后像这样在 BrowseDetailFragment 中使用静态 newInstance 方法:

BrowseDetailFragment.java

public class BrowseDetailFragment extends Fragment {

    private int position;

    public static BrowseDetailFragment newInstance(int position) {
        BrowseDetailFragment fragment = new BrowseDetailFragment();
        fragment.position = position;
        return fragment;
    }

    public BrowseDetailFragment() {
        //Required empty constructor
    }

    //Lifecycle methods and logics
}

确保提供一些导航选项,以便用户可以返回到您的列表。

关于android - 在 Android Studio 中单击 ListFragment 中的项目时显示详细信息 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28500492/

相关文章:

android - android中TextView的字体大小和高度有什么关系?

android - addToBackStack() 在按下后退按钮时复制原始 fragment

Android Fragments - 2 个 fragment 和 1 个框架布局

android - onItemClick 获取数组上项目的 ID 或名称

android - OnItemClick 和项目 View

android - 通过 "onItemClick"在ListView Android item上从SQLite数据库获取数据到intent

java - 创建分段进度条的最佳方法?

android - Jetpack Compose IntrinsicSize.Min 限定符强制文本为 2 行

android - 在列表 fragment 中,第一次单击列表项不会更改项目的背景

android - `canvas.clipRect` 和 `Region.Op.REPLACE` 的最佳替代方案是什么?