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)));