Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在片段中调用活动的方法?_Java_Android_Listview - Fatal编程技术网

Java 如何在片段中调用活动的方法?

Java 如何在片段中调用活动的方法?,java,android,listview,Java,Android,Listview,我有以下列表视图: @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //CheckBoxAdapter cb = new CheckBoxAdapter(this.getActivity(),R.layout.item, getResources().getStringArray(R

我有以下列表视图:

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    //CheckBoxAdapter cb = new CheckBoxAdapter(this.getActivity(),R.layout.item, getResources().getStringArray(R.array.products));
    //lv.setAdapter(cb);
    ArrayAdapter<String> arrayAdapter;
    arrayAdapter = new ArrayAdapter<String>(this.getContext(), android.R.layout.simple_list_item_1, categories);

    ListView lv = (ListView) this.getActivity().findViewById(R.id.listProduct);
    lv.setAdapter(arrayAdapter);

    lv.setOnItemClickListener(
            new AdapterView.OnItemClickListener(){
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    String type = String.valueOf(parent.getItemAtPosition(position));
                    Toast.makeText(getContext(), parent.getItemAtPosition(position)+" is selected", Toast.LENGTH_LONG).show();
                    try {
                        MainActivity.AddSubscription(String.valueOf(parent.getItemAtPosition(position)));
                    } catch (TimeoutException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    );

我需要创建一个可以调用addsubscription的非静态侦听器,是否可以使用listview?如果没有,我可以使用其他类型的视图吗?

如果您的片段被放置在MainActivity中,请执行以下操作:

((MainActivity)getActivity()).AddSubscription(String.valueOf(parent.getItemAtPosition(position)));

我不会使用
getActivity()
并强制转换它,因为这种方法对我来说似乎很脆弱

我是在没有IDE的情况下输入的,所以可能会有打字错误。 让
活动
实现一个接口
SubscriptionHandler

public interface SubscriptionHandler {
    public void addSubscription(String identifier);
}
活动

public MainActivity extends AppCompatActivity implements SubscriptionHandler {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_id);
        fragment.setSubscriptionHandler(this);
   }

   @Override
   public void addSubscription(String identifier){
   //logic
   }

}
然后在片段中使用这个

 public class MyFragment extends Fragment {

    @Nullable private SubscriptionHandler subscriptionHandler;

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ArrayAdapter<String> arrayAdapter;
        arrayAdapter = new ArrayAdapter<String>(this.getContext(), android.R.layout.simple_list_item_1, categories);

        ListView lv = (ListView) this.getActivity().findViewById(R.id.listProduct);
        lv.setAdapter(arrayAdapter);

        lv.setOnItemClickListener(
            new AdapterView.OnItemClickListener(){
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    String type = String.valueOf(parent.getItemAtPosition(position));
                    Toast.makeText(getContext(), parent.getItemAtPosition(position)+" is selected", Toast.LENGTH_LONG).show();
                    try {
                        if(subscriptionManager != null) {
                            subscriptionHandler.addSubscription(String.valueOf(parent.getItemAtPosition(position)));
                        }
                    } catch (TimeoutException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
           }
     );

     public void setSubscriptionHandler (SubscriptionHandler subscriptionHandler) {
        this.subscriptionHandler = subscriptionHandler;
     }
 } 
公共类MyFragment扩展了片段{
@可为空的私有SubscriptionHandler SubscriptionHandler;
@凌驾
ActivityCreated上的公共无效(@Nullable Bundle savedinStateCState){
super.onActivityCreated(savedInstanceState);
ArrayAdapter ArrayAdapter;
arrayAdapter=新的arrayAdapter(this.getContext(),android.R.layout.simple\u list\u item\u 1,categories);
ListView lv=(ListView)this.getActivity().findViewById(R.id.listProduct);
低压设置适配器(阵列适配器);
lv.setOnItemClickListener(
新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
字符串类型=String.valueOf(parent.getItemAtPosition(position));
Toast.makeText(getContext(),parent.getItemAtPosition(position)+“已选中”,Toast.LENGTH_LONG.show();
试一试{
if(subscriptionManager!=null){
subscriptionHandler.addSubscription(String.valueOf(parent.getItemAtPosition(position));
}
}捕获(超时异常e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
);
public void setSubscriptionHandler(SubscriptionHandler SubscriptionHandler){
this.subscriptionHandler=subscriptionHandler;
}
} 

在侦听器中执行以下操作:

YourFragmentName.this.((MainActivity)getActivity()).AddSubscription(String.valueOf(parent.getItemAtPosition(position)));

删除MainActivity.,直接调用AddSubscription(…)方法这是在一个片段中不起作用,首先AddSubscription方法在MainActivity中,其次它给了我一个错误:“MainActivity不是封闭类”此listview在片段中哦,如果在片段中,您是否尝试调用
getActivity()
?这似乎给了我一个NullPointerException尝试用
getContext()替换
getActivity()
好的,谢谢,您知道如何获取片段吗?实例化fragmentmanager并调用findfragmentbyId似乎只返回一个fragment类型的对象,我需要它与我的类类型相同。使用fragmentmanager是正确的方法,您只需以与按钮和所有其他v相同的方式强制转换它查看。确保使用正确的FragmentManager。我编辑了答案。这种方法似乎返回空值,我希望我在正确的位置添加了id xml标记android:id=“@+id/listFragment”这是在framelayoutIt取决于您是在xml中创建片段还是以编程方式创建它。如果您自己创建它
new MyFragment
,并将其设置为布局,则只需在那里调用
setSubscriptionHandler
。很抱歉,我无法提供更多帮助。创建片段的方法有很多,很难帮助p在没有代码的情况下输出更多
YourFragmentName.this.((MainActivity)getActivity()).AddSubscription(String.valueOf(parent.getItemAtPosition(position)));