Java 创建wordsearch android应用程序。使用片段实现用户界面

Java 创建wordsearch android应用程序。使用片段实现用户界面,java,android,gridview,android-fragments,wordsearch,Java,Android,Gridview,Android Fragments,Wordsearch,我对编码非常陌生,尤其是Java,所以如果我错过了任何基本上显而易见的东西,我道歉。用外行的话回答会有帮助 我正在尝试创建一个wordsearch应用程序。一个非常简单的游戏版本,没什么特别的。我已经做了一个网格视图来放置字母的图像,在那里可以选择作品,这是最上面的片段。底部片段包含正在搜索的字母 这是包含gridview的顶部片段的代码。这在一个独立的应用程序中工作,每个字母都可以选择,并且可以进行多个选择。但是,当尝试将其放入片段i=newimageview(TopWordsearchFra

我对编码非常陌生,尤其是Java,所以如果我错过了任何基本上显而易见的东西,我道歉。用外行的话回答会有帮助

我正在尝试创建一个wordsearch应用程序。一个非常简单的游戏版本,没什么特别的。我已经做了一个网格视图来放置字母的图像,在那里可以选择作品,这是最上面的片段。底部片段包含正在搜索的字母

这是包含gridview的顶部片段的代码。这在一个独立的应用程序中工作,每个字母都可以选择,并且可以进行多个选择。但是,当尝试将其放入片段
i=newimageview(TopWordsearchFragment.this)时
TopWordsearchFragment抛出错误“ImageView中的ImageView(android.content.Context)无法应用于(com.example.sebastian.multipleSelectGrid.TopWordsearchFragment”

这是我的第一个问题

package com.example.sebastian.multipleselectiongrid;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Checkable;
import android.widget.FrameLayout;
import android.widget.GridView;
import android.widget.ImageView;

public class TopWordsearchFragment extends Fragment {

GridView mGrid;

TopSectionListener activityCommander;

public interface TopSectionListener{
    public void searchWordsearchWords();
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try{
        activityCommander = (TopSectionListener)activity;
    }catch(ClassCastException e){
        throw new ClassCastException(activity.toString());
    }
}

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


    mGrid = (GridView) view.findViewById(R.id.myGrid);
    mGrid.setAdapter(new ImageAdapter());
    mGrid.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
    mGrid.setMultiChoiceModeListener(new MultiChoiceModeListener());

    return view;
}

public class ImageAdapter extends BaseAdapter {

    public View getView(int position, View convertView, ViewGroup parent) {
        CheckableLayout l;
        ImageView i;

        if (convertView == null) {
            i = new ImageView(TopWordsearchFragment.this);
            i.setScaleType(ImageView.ScaleType.FIT_XY);
            i.setLayoutParams(new GridView.LayoutParams(85, 85));
            l = new CheckableLayout(TopWordsearchFragment.this);
            l.setLayoutParams(new GridView.LayoutParams(
                    GridView.LayoutParams.WRAP_CONTENT,
                    GridView.LayoutParams.WRAP_CONTENT));
            l.addView(i);
        } else {
            l = (CheckableLayout) convertView;
            i = (ImageView) l.getChildAt(0);
        }


        i.setImageResource(mThumbIds[position]);
        return l;
    }

    public final int getCount() {
        return mThumbIds.length;
    }

    public final Object getItem(int position) {
        return null;
    }

    public final long getItemId(int position) {
        return 0;
    }

    private Integer[] mThumbIds = {
            R.drawable.letter_j, R.drawable.letter_s, R.drawable.letter_o, R.drawable.letter_l, R.drawable.letter_u, R.drawable.letter_t, R.drawable.letter_i, R.drawable.letter_s,
            R.drawable.letter_s, R.drawable.letter_u, R.drawable.letter_n, R.drawable.letter_a, R.drawable.letter_r, R.drawable.letter_u, R.drawable.letter_u, R.drawable.letter_a,
            R.drawable.letter_n, R.drawable.letter_e, R.drawable.letter_p, R.drawable.letter_t, R.drawable.letter_u, R.drawable.letter_n, R.drawable.letter_e, R.drawable.letter_t,
            R.drawable.letter_s, R.drawable.letter_o, R.drawable.letter_n, R.drawable.letter_i, R.drawable.letter_e, R.drawable.letter_i, R.drawable.letter_s, R.drawable.letter_u,
            R.drawable.letter_r, R.drawable.letter_c, R.drawable.letter_e, R.drawable.letter_v, R.drawable.letter_t, R.drawable.letter_r, R.drawable.letter_e, R.drawable.letter_r,
            R.drawable.letter_a, R.drawable.letter_h, R.drawable.letter_t, R.drawable.letter_r, R.drawable.letter_a, R.drawable.letter_e, R.drawable.letter_s, R.drawable.letter_n,
            R.drawable.letter_m, R.drawable.letter_m, R.drawable.letter_e, R.drawable.letter_r, R.drawable.letter_c, R.drawable.letter_u, R.drawable.letter_r, R.drawable.letter_y
    };
}

public class CheckableLayout extends FrameLayout implements Checkable {
    private boolean mChecked;

    public CheckableLayout(Context context) {
        super(context);
    }

    @SuppressWarnings("deprecation")
    public void setChecked(boolean checked) {
        mChecked = checked;
        setBackgroundDrawable(checked ? getResources().getDrawable(
                R.drawable.blue) : null);
    }

    public boolean isChecked() {
        return mChecked;
    }

    public void toggle() {
        setChecked(!mChecked);
    }

}

public class MultiChoiceModeListener implements
        GridView.MultiChoiceModeListener {
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        return true;
    }

    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return true;
    }

    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        return true;
    }

    public void onDestroyActionMode(ActionMode mode) {
    }

    public void onItemCheckedStateChanged(ActionMode mode, int position,
                                          long id, boolean checked) {

    }

}



}
我的第二个问题是片段不会出现。BottomSectionFragment不会显示任何编码错误,并且在我运行它后会抛出一个错误(下面将显示)。这是在注释掉上面的TopSectionFragment并从activity_main.xml文件中删除该片段之后

这是MainActivity.Java文件

package com.example.sebastian.multipleselectiongrid;


import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

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

        setContentView(R.layout.activity_main);
    }

}
package com.example.sebastian.multipleselectiongrid;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.app.Activity;

public class BottomSectionFragment extends Fragment {

   TextView word1;
   TextView word2;
   TextView word3;
   TextView word4;
   TextView word5;
   TextView word6;
   TextView word7;
   TextView word8;


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

        word1 = (TextView) view.findViewById(R.id.word1);
        word2 = (TextView) view.findViewById(R.id.word2);
        word3 = (TextView) view.findViewById(R.id.word3);
        word4 = (TextView) view.findViewById(R.id.word4);
        word5 = (TextView) view.findViewById(R.id.word5);
        word6 = (TextView) view.findViewById(R.id.word6);
        word7 = (TextView) view.findViewById(R.id.word7);
        word8 = (TextView) view.findViewById(R.id.word8);

        return view;

    }
}
下面是BottomSectionFragment.Java文件

package com.example.sebastian.multipleselectiongrid;


import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

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

        setContentView(R.layout.activity_main);
    }

}
package com.example.sebastian.multipleselectiongrid;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.app.Activity;

public class BottomSectionFragment extends Fragment {

   TextView word1;
   TextView word2;
   TextView word3;
   TextView word4;
   TextView word5;
   TextView word6;
   TextView word7;
   TextView word8;


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

        word1 = (TextView) view.findViewById(R.id.word1);
        word2 = (TextView) view.findViewById(R.id.word2);
        word3 = (TextView) view.findViewById(R.id.word3);
        word4 = (TextView) view.findViewById(R.id.word4);
        word5 = (TextView) view.findViewById(R.id.word5);
        word6 = (TextView) view.findViewById(R.id.word6);
        word7 = (TextView) view.findViewById(R.id.word7);
        word8 = (TextView) view.findViewById(R.id.word8);

        return view;

    }
}
当我同时运行这段代码时,我收到错误
FATAL EXCEPTION:main
java.lang.RuntimeException:无法启动activity ComponentInfo{com.example.sebastian.multipleSelectGrid/com.example.sebastian.multipleSelectGrid.MainActivity}:android.view.InflateException:二进制XML文件行#8:膨胀类片段时出错

并引发三个原因:
原因:android.view.InflateException:二进制XML文件行#8:错误膨胀类片段

Caused by: android.app.Fragment$InstantiationException: Trying to instantiate a class com.example.sebastian.multipleselectiongrid.BottomSectionFragment that is not a Fragment

Caused by: java.lang.ClassCastException
并在每三种情况下指向行
setContentView(R.layout.activity_main);

正如我所说,我对编码还不熟悉,答案可能非常明显,或者我用错误的方式解决了这个问题。因此,任何有用的信息或建议都将不胜感激

编辑:谢谢你的回答。我成功地解决了问题2。在我的MainActivity类中,如果我扩展了ActionBarActivity而不仅仅是Activity,它就可以正常工作。我检查了xml文件,它们的编码正是@Kumiho建议的

至于问题1,我无法解决在片段中使用此特定代码的问题,因此我将其保留在MainActivity中(进行了适当的编辑)。正如我所希望的那样,这两个代码正在一起工作。现在来实现功能


再次感谢。第一个问题:

在构造函数
i=newImageView(TopWordsearchFragment.this.getActivity())中使用片段的父活动;

第二个问题

二进制XML文件行#8:错误膨胀类片段
指向XML文件中的语法问题。您可能应该将该文件的内容添加到问题中

  • 您正在尝试将片段放入ImageView中。这不是它的工作方式。 有视图组和视图。视图只是不包含任何其他视图的视图,而视图组就像可以包含其他视图或视图组的容器。Fragment是指活动和视图组之间的内容。 您需要的是上下文。您可以通过调用getActivity()“请求”片段为您提供活动来获得上下文
  • 您的片段是否在活动的布局文件中声明?如果不是,您需要一个容器,您需要通过获取活动的fragmentManager并将片段放入其中,以编程方式添加它:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewgroup_activity_layout);
    
        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                .add(R.id.container_for_your_fragment, new MyFragment())
                .commit();
        }
    
  • 您的\u片段需要在viewgroup\u activity\u layout.xml中声明,并且需要是一个viewgroup

    使片段可见的另一种方法是在活动的布局中声明它:

    ...
    <fragment android:name="com.example.my.FragmentClass"
            android:id="@+id/fragment_id"            
            android:layout_width="match_parent"
            android:layout_height="match_parent" 
            ... (further parameters if needed)
    
    />
    ...
    
    。。。
    ...
    
    更多信息,你会发现

    祝你好运。

    我认为你应该阅读以了解什么是片段和活动以及它们是如何工作的。