Android requestfocus on unchecked radiogroup and show error beside each unchecked radiogroup

非 Y 不嫁゛ 提交于 2019-12-11 17:39:29

问题


I have set onclick event on a button(Submit). If the radio buttons of a radio group is not selected then I try to Toast message and focus/listview scroll the first unchecked radio group with error image beside or text(please select answer) as well as show error beside all unchecked radiogroup. I was able to achieve Toast message but not able to achieve focus and error beside on radiogroup which is unchecked.

**CustomAdapter**

    public class CustomAdapter extends BaseAdapter {
    Context context;
    String[] questionsList;
    LayoutInflater inflter;
    public ArrayList<String> selectedAnswers;
    public CustomAdapter(Context applicationContext, String[] questionsList) {
        this.context = context;
        this.questionsList = questionsList;
        resetAnswers();
        inflter = (LayoutInflater.from(applicationContext));
    }
    public void resetAnswers(){
        selectedAnswers = new ArrayList<>();
        for (int i = 0; i < questionsList.length; i++) {
            selectedAnswers.add("3");
        }
    }
    @Override
    public int getCount() {
        return questionsList.length;
    }
    @Override
    public Object getItem(int i) {
        return questionsList[i];
    }
    @Override
    public long getItemId(int i) {
        return i;
    }
    @Override
    public int getViewTypeCount() {
        return questionsList.length;
    }
    @Override
    public int getItemViewType(int i) {
        return i;
    }
    @Override
    public View getView(final int i, View convertView, ViewGroup viewGroup) {
        View view = convertView;
        if (convertView == null) {
            if (inflter != null) {
                view = inflter.inflate(R.layout.list_items, null);
            }
        }
        TextView question = (TextView) view.findViewById(R.id.question);
        question.setText(questionsList[i]);
        final RadioGroup rg = (RadioGroup)view.findViewById(R.id.radio_group);
        final RadioButton rb_yes = (RadioButton) rg.findViewById(R.id.yes);
        final RadioButton rb_no = (RadioButton) rg.findViewById(R.id.no);
        if(selectedAnswers.get(i).equals("1")){
            rg.check(R.id.yes);
             }else if(selectedAnswers.get(i).equals("2")){
            rg.check(R.id.no);
             }else{
            rb_yes.setBackgroundColor(Color.GRAY);
            rb_no.setBackgroundColor(Color.GRAY);
        }
        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                RadioButton rb_yes = (RadioButton) group.findViewById(R.id.yes);
                RadioButton rb_no = (RadioButton) group.findViewById(R.id.no);
                switch (checkedId){
                    case R.id.yes:
                        rb_yes.setBackgroundColor(Color.GREEN);
                        rb_no.setBackgroundColor(Color.BLACK);
                        selectedAnswers.set(i, "1");
                        break;
                    case R.id.no:
                        rb_yes.setBackgroundColor(Color.BLACK);
                        rb_no.setBackgroundColor(Color.rgb(255,165,0));
                        selectedAnswers.set(i, "2");
                        break;
                }
                if (checkedId !=-1){
                    Log.d("USB", "oniew "+checkedId);
                    rg.clearCheck();
                }
                else
                {
                    Log.d("USB", "towie "+checkedId);
                }
            }
        });
        if (rb_yes.isChecked()||rb_no.isChecked()){
            Log.d("USB", "checked");
        }
        else
        {
            Log.d("USB", "null ");
        }
        Log.d("USB", "I value "+i);
        return view;
    }
    public List<String> getSelectedAnswers(){
        return selectedAnswers;
    }

**Main Activity**

    public class MainActivity extends AppCompatActivity {
    private ListView simpleListView;
    private CustomAdapter customAdapter;
    private String[] questions;
    private Button submit, clear;
    private RadioGroup radioGroup;
    FileOutputStream fstream;
    private boolean forceClear;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setDisplayUseLogoEnabled(true);
        questions = getResources().getStringArray(R.array.questions);
        simpleListView = (ListView) findViewById(R.id.simpleListView);
        View Listview = getLayoutInflater().inflate(R.layout.list_items,null);
        RadioButton rb_yes = Listview.findViewById(R.id.yes);
        RadioButton rb_no =  Listview.findViewById(R.id.no);
        final RadioGroup radioGroup= Listview.findViewById(R.id.radio_group);
        View footerView = getLayoutInflater().inflate(R.layout.footer,null);
        clear= (Button) footerView.findViewById(R.id.clear);
        submit = (Button) footerView.findViewById(R.id.submit1);
        simpleListView.addFooterView(footerView);
        View headerView = getLayoutInflater().inflate(R.layout.header, null);
        simpleListView.addHeaderView(headerView);
        customAdapter = new CustomAdapter(getApplicationContext(),questions);
        simpleListView.setAdapter(customAdapter);
        clear.setOnClickListener(new View.OnClickListener() {
        @Override
            public void onClick(View v) {
            customAdapter.resetAnswers();
            customAdapter.notifyDataSetChanged();
}
});     
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {LayoutInflater inflater=getLayoutInflater();
View customToastroot=inflater.inflate(R.layout.mycustom_toast, null);
String message = "";
boolean found_unanswered = false;
if(customAdapter != null){
for(int i = 0 ;i<customAdapter.getSelectedAnswers().size() ; i++){                        if(customAdapter.getSelectedAnswers().get(i).equals("3")){
String p = customAdapter.getSelectedAnswers().get(i);
Log.d("USB", "ID check main "+customAdapter.getSelectedAnswers().get(i));
radioGroup.requestFocus();
radioGroup.requestFocusFromTouch();
Context context=getApplicationContext();
  Toast customtoast= new Toast(context);
                            customtoast.setView(customToastroot);
                            customtoast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL,0, 0);
                            customtoast.setDuration(Toast.LENGTH_LONG);
                            customtoast.show();
                            found_unanswered = true;
                            break;
                        }
message = message + "\n" + (i + 1) + " " + customAdapter.getSelectedAnswers().get(i);
                    }
                }
                if(!found_unanswered){
                    try {
                        fstream = openFileOutput("user_answer", Context.MODE_PRIVATE);
                        fstream.write(message.getBytes());
                        fstream.close();
                        Toast.makeText(getApplicationContext() ,message , Toast.LENGTH_LONG).show();
                        Intent inent = new Intent(view.getContext(), DetailsActivity.class);
                        startActivity(inent);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }
    @SuppressLint("RestrictedApi")
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        if(menu instanceof MenuBuilder){
            MenuBuilder m = (MenuBuilder) menu;
            m.setOptionalIconsVisible(true);
        }
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (id == R.id.about) {
            Intent inent = new Intent(MainActivity.this, devicedetailsActivity.class);
            startActivity(inent);
            return true;
        }
        if (id == R.id.admin) {
            Intent inent = new Intent(MainActivity.this, adminactivity.class);
            startActivity(inent);
            return true;
        }
        if (id == R.id.SerialPort) {
            Intent inent = new Intent(MainActivity.this, DeviceListActivity.class);
            startActivity(inent);
            return true;
        }
        if (id == R.id.customservice) {
            Intent inent = new Intent(MainActivity.this, testactivity_main.class);
            startActivity(inent);
            return true;
        }
        if (id == R.id.exit) {
            ActivityCompat.finishAffinity(MainActivity.this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

Thanks

回答1:


Try the following:

1) MainActivity_.class:-----------------

public class MainActivity_ extends AppCompatActivity {

private ListView lv;
private CustomAdapter customAdapter;
private String[] questions;
private Button submit;
private Button clear;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout8);

    questions = new String[10];

    for(int i = 0 ; i<10 ; i++){
        questions[i] = "Q " + i;
    }

    lv = (ListView) findViewById(R.id.lv);
    customAdapter = new CustomAdapter(getApplicationContext() , questions);
    lv.setAdapter(customAdapter);

    submit = (Button) findViewById(R.id.submit);
    submit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            boolean found_unanswered = false;
            int index_first_unanswered = 0;
            List<Integer> backgroundColor = new ArrayList<Integer>(); // new
            if(customAdapter != null){
                for(int i = 0 ; i<customAdapter.getSelectedAnswers().size() ; i++){
                    if(customAdapter.getSelectedAnswers().get(i).equals("3")){
                        if(!found_unanswered) { // new
                            found_unanswered = true;
                            index_first_unanswered = i; // new
                        }
                        backgroundColor.add(Color.RED); // new
                    }else{ // new
                        backgroundColor.add(Color.WHITE);
                    }
                }
            }

                if(!found_unanswered) {
                    Toast.makeText(getApplicationContext(), "All Answered", Toast.LENGTH_LONG).show();
                    customAdapter.setBackgroundColor(backgroundColor); // new
                    //Go to other activity
                }else{ // new
                    Toast.makeText(getApplicationContext(), "Found Unanswered", Toast.LENGTH_LONG).show();
                    if(customAdapter != null && lv != null){
                        customAdapter.setBackgroundColor(backgroundColor);
                        lv.smoothScrollToPosition(index_first_unanswered);
                    }
                }
        }
    });

    clear = (Button) findViewById(R.id.clear);
    clear.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (customAdapter != null) {
                customAdapter.clearSelectedAnswers();
            }
        }
    });

}


}

2) CustomAdapter.class:----------------

public class CustomAdapter extends BaseAdapter {

Context context;
String[] questionsList;
LayoutInflater inflter;
private List<String> selectedAnswers;
private List<Integer> backgroundColor; // new


public CustomAdapter(Context context, String[] questionsList) {
    this.context = context;
    this.questionsList = questionsList;
    selectedAnswers = new ArrayList<String>();
    backgroundColor = new ArrayList<Integer>(); // new
    for (int i = 0; i < questionsList.length; i++) {
        selectedAnswers.add("3");
        backgroundColor.add(Color.WHITE); // new
    }
    inflter = (LayoutInflater.from(context));
}

@Override
public int getCount() {
    return questionsList.length;
}

@Override
public Object getItem(int i) {
    return questionsList[i];
}

@Override
public long getItemId(int i) {
    return i;
}

@Override
public int getViewTypeCount() {
    return questionsList.length;
}

@Override
public int getItemViewType(int i) {
    return i;
}

@Override
public View getView(final int i, View convertView, ViewGroup viewGroup) {

    View view = convertView;

    if (convertView == null) {
        if (inflter != null) {
            view = inflter.inflate(R.layout.list_items, null);
        }
    }


    TextView question = (TextView) view.findViewById(R.id.question);
    question.setText(questionsList[i]);
    question.setBackgroundColor(backgroundColor.get(i)); // new

    // initialize/re-restore UI Radio Button State
    final RadioGroup rg = (RadioGroup) view.findViewById(R.id.radio_group);
    RadioButton rb_yes = (RadioButton) rg.findViewById(R.id.yes);
    RadioButton rb_no = (RadioButton) rg.findViewById(R.id.no);
    if(selectedAnswers.get(i).equals("1")){
        rg.check(R.id.yes);
        rb_yes.setBackgroundColor(Color.GREEN);
        rb_no.setBackgroundColor(Color.GRAY);
    }else if(selectedAnswers.get(i).equals("2")){
        rg.check(R.id.no);
        rb_yes.setBackgroundColor(Color.GRAY);
        rb_no.setBackgroundColor(Color.BLACK);
    }else {
      // no answer.
        rg.clearCheck(); // new
        rb_yes.setBackgroundColor(Color.GRAY);
        rb_no.setBackgroundColor(Color.GRAY);
    }

    rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            RadioButton rb_yes = (RadioButton) group.findViewById(R.id.yes);
            RadioButton rb_no = (RadioButton) group.findViewById(R.id.no);
            //Toast.makeText(context , (checkedId == R.id.yes)?"yes":"no" , Toast.LENGTH_LONG).show();
            switch (checkedId){
                case R.id.yes:
                    rb_yes.setBackgroundColor(Color.GREEN);
                    rb_no.setBackgroundColor(Color.GRAY);
                    selectedAnswers.set(i, "1");
                    break;
                case R.id.no:
                    rb_yes.setBackgroundColor(Color.GRAY);
                    rb_no.setBackgroundColor(Color.BLACK);
                    selectedAnswers.set(i, "2");
                    break;
                default: // new
                    rb_yes.setBackgroundColor(Color.GRAY);
                    rb_no.setBackgroundColor(Color.GRAY);
                    selectedAnswers.set(i, "3");
                    break;
            }
        }
    });

    return view;
}

public List<String> getSelectedAnswers(){
    return selectedAnswers;
}

public void clearSelectedAnswers(){
    selectedAnswers = new ArrayList<String>();
    backgroundColor = new ArrayList<Integer>();
    for (int i = 0; i < questionsList.length; i++) {
        selectedAnswers.add("3");
        backgroundColor.add(Color.WHITE); // new
    }
    this.notifyDataSetChanged();
}

public void setBackgroundColor(List<Integer> backgroundColor_){ // new
    this.backgroundColor = backgroundColor_;
    this.notifyDataSetChanged();
}

}

3) layout_8.xml:---------

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="100"
android:orientation="vertical">

<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="90"
    android:id="@+id/lv">
</ListView>

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="70dp"
    android:layout_weight="10"
    android:layout_marginTop="10dp"
    android:layout_marginBottom="10dp"
    android:orientation="horizontal">

    <Button
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Submit"
        android:layout_toStartOf="@id/v"
        android:textAllCaps="false"
        android:id="@+id/submit"/>

    <View
        android:layout_width="1dp"
        android:layout_height="0dp"
        android:id="@+id/v"
        android:layout_centerInParent="true">
    </View>

    <Button
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Clear"
        android:layout_toEndOf="@id/v"
        android:textAllCaps="false"
        android:id="@+id/clear"/>

</RelativeLayout>

</LinearLayout>

4) list_items.xml:--------

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
<!-- TextView for displaying question-->
<TextView
    android:id="@+id/question"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:textColor="#000"
    android:textSize="30dp"
    android:text="Which is your most favorite?"
    />
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:id="@+id/main">
    <RadioGroup
        android:id="@+id/radio_group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:orientation="horizontal">
        <RadioButton
            android:id="@+id/yes"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="20dp"
            android:button="@null"
            android:paddingHorizontal="30dp"
            android:paddingVertical="5dp"
            android:text="YES"
            android:textSize="50dp" />
        <RadioButton
            android:id="@+id/no"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:button="@null"
            android:paddingHorizontal="30dp"
            android:paddingVertical="5dp"
            android:text="NO"
            android:textSize="50dp" />
    </RadioGroup>
</FrameLayout>

</LinearLayout>


来源:https://stackoverflow.com/questions/51392877/android-requestfocus-on-unchecked-radiogroup-and-show-error-beside-each-unchecke

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!