【问题标题】:Android Activity methods in FragmentFragment 中的 Android Activity 方法
【发布时间】:2016-04-20 23:24:15
【问题描述】:

我有一个片段活动,用于制作标签栏。在这个活动中,我计划放置一个带有一些随机值的表或 ListViews。

这是我的代码:

import com.example.mvaguimaraes.beetrackprov.R;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.ArrayAdapter;
import android.widget.Toast;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView;


public class Orders extends Fragment {

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

        ListView listView1 = (ListView) findViewById(R.id.listView1);


        Order[] items = {
                new Order(1, "Milk", 21.50),
                new Order(2, "Butter", 15.99),
                new Order(3, "Yogurt", 14.90),
                new Order(4, "Toothpaste", 7.99),
                new Order(5, "Ice Cream", 10.00),
        };

        ArrayAdapter<Order> adapter = new ArrayAdapter<Order>(this,
                android.R.layout.simple_list_item_1, items);

        listView1.setAdapter(adapter);

        listView1.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                                    long id) {

                String item = ((TextView) view).getText().toString();

                Toast.makeText(getBaseContext(), item, Toast.LENGTH_LONG).show();

            }
        });

    }

}

问题是我无法将 Orders 类扩展到 Fragment 和 Activity,所以我的代码中出现了这个错误:

无法解析方法 findViewByID(int)

ListView listView1 = (ListView) findViewById(R.id.listView1);

无法解析构造函数

ArrayAdapter<Order> adapter = new ArrayAdapter<Order>(this,
                android.R.layout.simple_list_item_1, items);

无法解析方法 getBaseContext()

Toast.makeText(getBaseContext(), item, Toast.LENGTH_LONG).show();

可能是因为他们从 Activity 继承了一些东西。有什么方法可以让它们在 Fragment 中工作?对不起我的菜鸟,我是 Android 开发的新手。

要在单击列表视图的一个项目后打开另一个屏幕,我在 onItemClick public void 方法之后立即执行此操作:

String item = ((TextView) view).getText().toString();

                Intent i = new Intent(getApplicationContext(), OrderDetails.class);
                i.putExtra("new_variable_name",item);

                Intent browserIntent =
                        new Intent(Orders.this, OrderDetails.class);

                startActivity(browserIntent);
                startActivity(i);

我尝试将“getApplicationContext()”和“Orders.this”都替换为“getActivity()”,但没有成功。

【问题讨论】:

    标签: android android-activity fragment extends


    【解决方案1】:

    片段没有像活动这样的findViewById() 方法。相反,您调用findViewById() 来查找在onCreateView() 中膨胀布局返回的View 上的视图。此外,在您需要 Context 的地方,您通常使用 Activity 通过调用 getActivity() 来附加片段。

    public class Orders extends Fragment {
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.orders, container, false);
            ListView listView1 = (ListView) v.findViewById(R.id.listView1);
    
            Order[] items = {
                    new Order(1, "Milk", 21.50),
                    new Order(2, "Butter", 15.99),
                    new Order(3, "Yogurt", 14.90),
                    new Order(4, "Toothpaste", 7.99),
                    new Order(5, "Ice Cream", 10.00),
            };
    
            ArrayAdapter<Order> adapter = new ArrayAdapter<Order>(getActivity(),
                    android.R.layout.simple_list_item_1, items);
    
            listView1.setAdapter(adapter);
    
            listView1.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position,
                                        long id) {
                    String item = ((TextView) view).getText().toString();
                    Toast.makeText(getActivity(), item, Toast.LENGTH_LONG).show();
                }
            });
    
            return v;
        }
    }
    

    【讨论】:

    • 你能帮我做一件事吗?从列表视图中单击一个项目后,我想打开一个新屏幕/活动并将“项目”发送到此屏幕。我将用我的代码修改原始帖子。
    • 刚刚修改了原来的问题。你介意帮帮我吗?
    • 您不应该同时开始两项活动。只启动其中一个。在这两种情况下,您都应该使用getActivity() 作为Intent(...) 构造函数的第一个参数。如果您尝试只启动一个Activity 以什么方式不起作用?它是否使应用程序崩溃?也许您在开始的其他Activity 中有问题?
    • 应用程序崩溃了。但是我忘了在 AndroidManifest 中添加新的应用程序,抱歉。有没有更好的方法来做到这一点(重定向到另一个屏幕并将字符串“项目”发送到这个屏幕)而不是同时启动两个应用程序?
    • 我刚刚注意到ibrowserIntent 的意图都以相同的OrderDetails Activity 开头?为什么你两次启动相同的Activity?向Intent 添加额外内容是将数据传递给另一个Activity 的正确方法。如果您想将数据保存在当前的 Activity 中,您只需保留对它的引用并在 onSaveInstanceState()onRestoreInstanceState() 中正确保存/恢复它。
    猜你喜欢
    • 1970-01-01
    • 2012-11-27
    • 2021-07-18
    • 2016-11-27
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多