【问题标题】:How to make fragment transaction when clicked on a listitem?单击列表项时如何进行片段交易?
【发布时间】:2012-10-29 11:06:25
【问题描述】:

我有一个活动,其中包含一个 ActionBar(有四个选项卡),一个片段分别分配给每个选项卡。在这些片段中,我分配了一些填充了字符串值的 ListAdapter,这些值可以点击,而且我还想操作。单击一个项目时,我希望该应用程序从该片段发送到另一个。我知道我必须使用 FragmentManager() 和 FragmentTransaction() 但由于我是 Android 开发新手,我需要任何形式的帮助,不胜感激。

这是其中一个选项卡的 sn-p 代码(UserFragment.java):

    import android.app.ListFragment;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;


/** This is a listfragment class */
public class UserFragment extends ListFragment 
{

    /** An array of items to display in ArrayList */
    String user_items[] = new String[]
    {
        "Account",
        "Addresses",         
        "Payment Providers",
        "Profile",
        "Transactions",
        "Wallet"
    };

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    {
        /** Creating array adapter to set data in listview */
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity().getBaseContext(), android.R.layout.simple_expandable_list_item_1, user_items);

        /** Setting the array adapter to the listview */
        setListAdapter(adapter);

        getListView().setOnItemClickListener(new OnItemClickListener()
        {
            public void onItemClick(AdapterView<?> parent, View view, int pos,
                    long id) 
            {
                Intent myIntent = new Intent(getActivity().getBaseContext(), Profile.class);
                startActivity(myIntent);            
            }       
        }); 
        return super.onCreateView(inflater, container, savedInstanceState);     
    }

    @Override
    public void onStart() 
    {
        super.onStart();

        /** Setting the multiselect choice mode for the listview */
        getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    }
}

Profile.java 活动代码:

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
public class Profile extends Activity 
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.profile_layout);

        //Button test = (Button) findViewById(R.id.btnTest);
    }
}

【问题讨论】:

    标签: android android-intent android-fragments fragmenttransaction


    【解决方案1】:

    您需要为您的ListFragment 定义OnItemClickListener 来处理项目点击事件。例如:

    getListView().setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3){
            // start your new activity here
        }
    });
    

    【讨论】:

    • 我尝试了您的建议,但当我切换到启动 OnItemClickListener 的选项卡时,我的应用程序崩溃了。错误是这样的:“java.lang.IllegalStateException: Content view not yet created” 最近插入的代码是:getListView().setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView> parent, View view, int pos , long id) { Intent myIntent = new Intent(getActivity().getBaseContext(), Profile.class); startActivity(myIntent); } });
    【解决方案2】:

    我发现了问题所在。经过长时间的搜索,我了解到如果 onCreateView() 方法是静态的,那么设置 listener/s 就很好,但在这种情况下,当我们填充字符串的数组适配器时,这是不行的因为首先它必须创建它的视图,因此不允许应用程序进行任何进一步的侦听器。为了使其可用,应该在 onCreateView()onStart()onActivityCreated(Bundle) /strong> 方法并插入其余代码。

    以下是将 ListFragment 链接到另一个 FragmentActivity 类的解决方案:

    public void onActivityCreated(Bundle savedInstanceState)
        {    
            super.onActivityCreated(savedInstanceState);
    
            getListView().setOnItemClickListener(new OnItemClickListener()
            {
                public void onItemClick(AdapterView<?> parent, View view, int pos,
                        long id) 
                {
                    Intent myIntent = new Intent(getActivity().getBaseContext(), Profile.class);
                    startActivity(myIntent);            
                }       
            });
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多